071135-为PetUser表增加软删除功能.md 5.0 KB

为PetUser表增加软删除功能

任务时间

  • 开始时间:2025年06月07日 11:27:43 CST
  • 完成时间:2025年06月07日 11:40:00 CST

任务描述

为宠物用户表(PetUser)增加软删除功能,使得删除的宠物记录不会从数据库中物理删除,而是通过deleted_at字段标记为已删除状态。

实现内容

1. 模型修改

文件:app/Module/Pet/Models/PetUser.php

  • 添加 use Illuminate\Database\Eloquent\SoftDeletes; 引用
  • 在类中使用 use SoftDeletes; trait
  • 在field注释块中添加 @property \Carbon\Carbon $deleted_at 删除时间
  • 在casts数组中添加 'deleted_at' => 'datetime'

2. 数据库结构修改

文件:app/Module/Pet/Databases/GenerateSql/pet_users.sql

  • 在表结构中添加 deleted_at 字段定义
  • 字段类型:timestamp NULL DEFAULT NULL COMMENT '删除时间'

文件:app/Module/Pet/Databases/AddSoftDeletesToPetUsers.sql

  • 创建专门的SQL文件用于添加软删除字段
  • 包含添加字段和索引的SQL语句

数据库迁移文件:database/migrations/2025_06_07_113048_add_soft_deletes_to_pet_users_table.php

  • 创建Laravel迁移文件(虽然迁移被禁用,但保留文件用于记录)
  • 包含up和down方法的完整迁移逻辑

3. 后台管理支持

文件:app/Module/Pet/AdminControllers/PetUserController.php

  • 在Grid中添加 deleted_at 列显示
  • 在Show页面中添加 deleted_at 字段显示
  • 在筛选器中添加软删除相关的筛选选项:
    • trashed 作用域:只显示已删除的记录
    • with_trashed 作用域:显示包含已删除的所有记录

4. 测试用例

文件:app/Module/Pet/Tests/PetUserSoftDeleteTest.php

  • 创建完整的软删除测试用例
  • 测试内容包括:
    • 基本软删除功能
    • 强制删除功能
    • 软删除对关联查询的影响
    • 软删除的查询作用域(withTrashed、onlyTrashed)

数据库执行

由于数据库迁移被禁用,手动执行了以下SQL语句:

-- 添加 deleted_at 字段
ALTER TABLE `kku_pet_users` 
ADD COLUMN `deleted_at` timestamp NULL DEFAULT NULL COMMENT '删除时间' AFTER `updated_at`;

-- 为 deleted_at 字段添加索引
ALTER TABLE `kku_pet_users` 
ADD INDEX `idx_deleted_at` (`deleted_at`);

功能验证

通过创建测试命令验证了软删除功能的完整性:

测试结果

=== 宠物软删除功能测试 ===

1. 创建测试宠物...
   ✓ 创建成功,宠物ID: 15

2. 验证宠物存在...
   ✓ 宠物存在,名称: 软删除测试宠物
   ✓ deleted_at: null
   ✓ trashed(): false

3. 软删除宠物...
   ✓ 软删除完成

4. 验证软删除后的状态...
   ✓ 正常查询找不到宠物(符合预期)

5. 使用withTrashed查询...
   ✓ withTrashed可以找到宠物
   ✓ deleted_at: 2025-06-07 11:35:39
   ✓ trashed(): true

6. 使用onlyTrashed查询...
   ✓ 找到 1 个已删除的宠物

7. 恢复宠物...
   ✓ 恢复完成

8. 验证恢复后的状态...
   ✓ 宠物已恢复,deleted_at: null
   ✓ trashed(): false

9. 强制删除宠物...
   ✓ 强制删除完成

10. 验证强制删除后的状态...
   ✓ 强制删除成功,宠物完全删除

软删除功能说明

基本用法

// 软删除
$pet->delete();

// 恢复
$pet->restore();

// 强制删除(物理删除)
$pet->forceDelete();

// 检查是否已删除
$pet->trashed();

查询作用域

// 默认查询(不包含已删除)
PetUser::all();

// 包含已删除的记录
PetUser::withTrashed()->get();

// 只查询已删除的记录
PetUser::onlyTrashed()->get();

后台管理

  • 在宠物管理页面可以查看deleted_at字段
  • 可以通过筛选器查看已删除的宠物
  • 支持"已删除"和"包含已删除"两种筛选模式

影响范围

  1. 现有查询:所有使用PetUser模型的查询会自动排除已软删除的记录
  2. 关联查询:相关的关联查询也会自动排除已软删除的宠物
  3. 后台管理:管理员可以查看和管理已删除的宠物记录
  4. 数据安全:删除的宠物数据不会丢失,可以恢复

注意事项

  1. 软删除不会影响现有的业务逻辑,因为Laravel会自动处理
  2. 如果需要查询包含已删除的记录,需要显式使用withTrashed()
  3. 强制删除会永久删除记录,无法恢复
  4. deleted_at字段已添加索引,不会影响查询性能

提交信息

为PetUser表增加软删除功能

- 在PetUser模型中添加SoftDeletes trait和deleted_at字段
- 更新模型的field注释块和casts数组,包含deleted_at字段
- 创建数据库迁移文件添加deleted_at字段和索引
- 更新SQL生成文件包含deleted_at字段定义
- 为后台管理添加软删除支持,包括deleted_at列显示和筛选功能
- 创建完整的软删除测试用例,验证软删除、恢复和强制删除功能
- 手动执行SQL添加deleted_at字段到数据库表
- 通过测试验证软删除功能完全正常工作