查不到软删数据是因为默认查询自动过滤delete_time非空记录,必须用user::onlytrashed()->where('id',123)->find()显式查询;restoreall()方法不存在,批量恢复需db::update清空delete_time或先查集合再逐条restore。

查不到软删数据?先确认是否用了 onlyTrashed()
默认查询会自动过滤掉 delete_time 非空的记录,所以 User::where('id', 123)->find() 查不到已软删的数据,不是数据丢了,是被框架主动屏蔽了。必须显式加 onlyTrashed() 才能定位目标:
-
User::onlyTrashed()->where('id', 123)->find()—— 只查已软删的 -
User::withTrashed()->where('id', 123)->find()—— 查全部(含软删) - 这两个方法必须在
find()或select()前链式调用,否则无效 - 如果模型没启用
SoftDeletetrait,或数据库字段类型不是DATETIME NULL,onlyTrashed()查询结果为空,但不会报错
别信 restoreAll() —— 它根本不存在
ThinkPHP 5.x 和 6.x 的模型类里没有 restoreAll() 方法。任何类似 User::restoreAll() 的写法都会直接报错:Call to undefined method。网上看到的大多是旧版 TP3 的误传,或是开发者自己封装的扩展。
- 批量恢复只有两条路:走模型逻辑(触发事件、校验),或绕过模型(快但无钩子)
- 想触发
restoring/restored事件,得先查出集合再逐条调用:User::onlyTrashed()->chunk(500, function ($items) { $items->each->restore(); }); - 不关心事件,只要结果,直接用
Db::name('user')->where('delete_time', 'not null')->update(['delete_time' => null]) - TP 6.x 中
User::onlyTrashed()->update(['delete_time' => null])是合法写法;TP 5.x 则需改用save()或Db类
restore() 静默失败?检查字段配置和数据库约束
restore() 是模型实例方法,调用后不报错、不抛异常,但可能什么都没做——最常见原因是软删字段没对齐。
- 模型中必须有
use SoftDelete;,且protected $deleteTime = 'delete_time';(若字段名不同,如is_deleted,必须同步修改) - 数据库字段必须是可空类型:
delete_time DATETIME NULL,不能设NOT NULL DEFAULT '0000-00-00 00:00:00',否则 MySQL 严格模式下写入null会失败 - 若字段是整型时间戳(如
BIGINT),模型中还得加protected $type = ['delete_time' => 'integer'];,否则null会被转成字符串再强转为0,导致后续仍被判定为已删除 - 调用前务必验证存在性:
User::onlyTrashed()->where('id', 123)->value('id')返回非null再执行restore()
按条件批量恢复,别链式调用 restore()
User::where('status', 1)->onlyTrashed()->restore() 这种写法是错的。restore() 不接受查询构造器链式结果,它只认模型实例。强行这么写,要么报错,要么静默跳过。
- 安全做法是先取 ID 列表:
$ids = User::onlyTrashed()->where('status', 1)->column('id');,再Db::name('user')->where('id', 'in', $ids)->update(['delete_time' => null]) - 如果必须走模型逻辑(比如要恢复关联数据),就分两步:
$users = User::onlyTrashed()->where('status', 1)->select();,然后遍历$user->restore() - 事务场景下,多张表恢复时注意字段名大小写、NULL 处理是否统一,尤其跨模型时容易因
$deleteTime配置不一致导致部分表恢复失败 - MySQL 开启
STRICT_TRANS_TABLES时,delete_time字段若被误设为NOT NULL,update操作会直接中断,整个事务回滚
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











