thinkphp5软删除必须模型引入、字段定义、调用方式三者严格对齐:模型需顶部导入use traits\model\softdelete;并显式use softdelete;,字段须为null的datetime/timestamp或bigint配$type声明,删除仅支持$user->delete()或usermodel::destroy(),禁用db类直删。

ThinkPHP5软删除不是加个字段或改个配置就能跑通,必须模型引入、字段定义、调用方式三者严格对齐,缺一不可;否则 delete() 或 destroy() 会直接物理删库,查不到数据也找不到原因。
模型里怎么正确引入 SoftDelete trait
很多问题出在“看似引入了,其实没生效”。关键点就三个:
-
use traits\model\SoftDelete;必须写在类顶部(注意是traits\model\SoftDelete,不是think\model\concern\SoftDelete——后者是 TP6 的路径) - 类定义中必须显式写
use SoftDelete;,光导入命名空间不等于启用 trait - 如果软删字段不是默认的
delete_time(比如叫is_deleted或deleted_at),必须声明protected $deleteTime = 'is_deleted'; -
$defaultSoftDelete在 TP5 中仅当用整型标记(如 0/1)时才需配置,且值必须是 0;若用时间戳类型,这个属性不要设,否则可能干扰逻辑
数据库字段必须满足哪些约束
这是静默失败最高发的环节:字段类型或 NULL 约束不对,delete() 表面成功,实际没写入时间、也没报错,数据就“消失”了。
- 字段类型建议用
DATETIME或TIMESTAMP,且必须设为NULL;不能带DEFAULT CURRENT_TIMESTAMP——否则新记录一插入,delete_time就有值,被误判为已删除 - 若用
BIGINT存时间戳(如delete_time BIGINT UNSIGNED NULL),模型里要加protected $type = ['delete_time' => 'integer'];,否则写入时会被转成字符串再强转为 int,结果常为 0 - 绝对禁止设
NOT NULL;哪怕你给它配了默认值 0 或NULL,MySQL 8.0+ 对约束更敏感,仍可能跳过软删逻辑
为什么 Db::table()->delete() 会直接物理删除
软删除是模型层功能,不是数据库层能力。只要调用了 where(),就已脱离模型上下文,进入 Db 类执行流程。
-
UserModel::where('id', 1)->delete()是错的——这本质是Db::name('user')->where()->delete(),绕过了所有模型逻辑 - 正确做法只有两种:
$user->delete()(实例方法)或UserModel::destroy(1)(静态方法) -
destroy()支持批量:UserModel::destroy([1,2,3])、UserModel::destroy('1,2,3'),也支持闭包条件,但底层仍走模型逻辑 - 想物理删,必须显式传
true:UserModel::destroy(1, true)或$user->delete(true)
查询和恢复必须走模型方法,不能绕过
用 Db::name('user')->delete(1) 或 Db::table('user')->where()->delete() 会跳过所有模型逻辑,直接物理删除——这是最常踩的坑。
- 查全部(含已删):必须在
select()或find()前链式调用withTrashed(),例如UserModel::withTrashed()->find(1);withTrashed(true)是 TP5 写法,TP6 已不支持布尔参数 - 只查已删:用
onlyTrashed(),例如UserModel::onlyTrashed()->select() - 恢复数据只能是实例方法:
$user->restore();不能UserModel::where()->restore(),会报Call to undefined method - 恢复前必须先查出软删状态的记录:
$user = UserModel::onlyTrashed()->find(1); if ($user) $user->restore();,否则restore()静默返回false
最容易被忽略的是运行时缓存:修改字段后没清 runtime/cache/,模型会按旧结构解析,导致软删字段识别失败——表面一切正常,实际 delete_time 始终不更新。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










