ThinkAdmin/docs/architecture/soft-delete-standard.md
Anyon 6f4056f64d docs(architecture): 完善 v8 架构与迁移说明
补充 v8 重构后的架构文档、组件说明和迁移记录,方便后续维护者理解插件边界。

主要内容:

- 更新根 README,说明 v8 插件分层、系统模块、交付命令和验证流程。

- 新增组件明细、插件边界、路由分发、软删除和稳定性文档。

- 记录 Storage 合并到 System、旧 View 移除和 Helper 并入 System 的决策。

- 补充文档注释报告和后续重构计划,便于持续演进。
2026-05-08 15:31:22 +08:00

1.9 KiB
Raw Blame History

Soft Delete Standard

当前结论

  • ORM 软删除字段统一为 delete_time
  • delete_time 是唯一允许继续新增到数据库脚本里的软删除物理字段
  • deleteddeleted_timedeleted_at 不再作为物理字段或兼容迁移保留
  • 不需要软删除的模型,不应再通过 deleteTime = false 反向关闭,而应直接使用不带 SoftDelete 的普通基类

当前实现

1. 模型默认时间字段

  • 基类 think\admin\Model 默认使用 create_timeupdate_time
  • 软删除模型统一使用 SoftDelete trait并把目标字段固定为 delete_time

2. 删除执行路径

  • 使用 DeleteHelper 删除模型时:
    • 模型启用了 SoftDelete,则写入 delete_time
    • 模型未启用 SoftDelete,则执行物理删除

3. 基类约束

  • 软删除模型应继承带 SoftDelete 的业务基类
  • 非软删除模型应继承普通业务基类
  • 不再推荐在同一个基类体系里通过 deleteTime = false 做例外开关

禁止事项

以下写法不再允许继续引入:

  • deleted
  • deleted_time
  • deleted_at
  • whereRaw('deleted=0')
  • field(...deleted...)
  • withoutField('deleted')

这些写法都会把代码重新绑回旧字段语义。

新代码规范

  1. 新表需要软删除时,只能使用 delete_time datetime null
  2. 新模型需要软删除时,使用统一软删除基类或显式 SoftDelete
  3. 新模型不需要软删除时,直接使用普通基类,不再写 deleteTime = false
  4. 业务状态和软删除必须分开设计,不能混用“作废/取消/失效”字段代替软删除
  5. 数据库脚本、模型注释、测试断言都必须统一使用 delete_time

清理结果

  • 历史兼容软删除迁移已经退化为空迁移占位,不再执行任何字段兼容逻辑
  • 软删除与物理删除模型已经按基类分流
  • 后续如果再出现旧字段名或 deleteTime = false,应视为回归