thinkphp6模型软删除恢复需满足三要素:模型启用softdelete trait并配置$deletetime字段、数据库delete_time字段为datetime/timestamp且允许null默认null、调用restore()前必须先查出模型实例;否则静默失败。

ThinkPHP6模型软删除恢复,核心是让被标记为“已删除”的数据重新变为有效状态,即把 delete_time 字段清空(设为 NULL)。但这个过程不是调个方法就完事,必须满足模型、字段、调用三者严格对齐,否则 restore() 会静默失败——不报错、不写库、数据原地不动。
模型配置必须完整启用软删
只写 use SoftDelete; 是不够的,缺一不可:
- 引入正确命名空间:
use think\model\concern\SoftDelete; - 类内声明 trait:
use SoftDelete; - 显式指定字段名:
protected $deleteTime = 'delete_time';(即使用默认名也建议写上) - 低版本(TP6.0.0–6.0.7)必须加开关:
protected $useSoftDelete = true;;6.0.8+ 可省略,但写上更稳妥 - 改完后运行
php think optimize:schema刷新模型缓存,否则旧配置仍生效
数据库字段必须合规
delete_time 是硬性门槛,错一点就恢复失败:
- 类型必须是
DATETIME或TIMESTAMP -
Null列必须为YES(允许 NULL) -
Default值必须为NULL,不能是'1970-01-01'、CURRENT_TIMESTAMP或其他固定值 - 验证命令:
DESCRIBE user;(把user换成你的表名) - 不合规时修复:
ALTER TABLE `user` MODIFY COLUMN `delete_time` DATETIME NULL DEFAULT NULL;
单条恢复要先查再调用实例方法
不能跳过模型直接操作数据库,否则不触发事件、不校验逻辑:
- ✅ 正确写法:
$user = UserModel::onlyTrashed()->find($id);if ($user && $user->restore()) { /* 成功 */ } else { /* 失败,检查返回值 */ } - ❌ 错误写法:
UserModel::where('id', $id)->restore();(链式调用返回查询器,不是模型实例) - ⚠️ 紧急救火可直写 DB(跳过事件):
UserModel::where('id', $id)->update(['delete_time' => null]);
批量恢复不能链式调用 restore()
restore() 是模型实例方法,不支持集合或查询构造器直接调用:
- ❌ 无效写法:
UserModel::onlyTrashed()->where('status', 1)->restore(); - ✅ 安全做法(推荐,走模型事件):
UserModel::onlyTrashed()->where('status', 1)->chunk(200, function ($users) {<br> $users->each->restore();<br>});
注意:闭包内需判断每个$user->restore()返回值,跳过失败项 - ✅ 高效做法(直写 DB,无事件):
$ids = UserModel::onlyTrashed()->where('status', 1)->column('id');UserModel::whereIn('id', $ids)->update(['delete_time' => null]);
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











