TP5.1软删除迁移需改三处:trait路径改为think\model\concern\SoftDelete;$deleteTime字段需显式设defaultSoftDelete;withTrashed()返回Query对象,链式调用需注意toArray()及条件追加规则。

软删除配置从 TP5.0.24 迁移到 TP5.1,核心变化是 trait 引入路径、字段默认值逻辑、查询方法行为三处必须改,否则模型查不到数据或报错。
trait 引入路径从 think\model\SoftDelete 改为 think\model\concern\SoftDelete
TP5.0.24 中常见写法:use think\model\SoftDelete;,TP5.1 已移除该路径,直接 use 会触发类找不到错误。必须改为:
use think\model\concern\SoftDelete;
同时确保模型中正确启用:
class UserModel extends Model
{
use SoftDelete;
protected $deleteTime = 'delete_time';
}
若仍沿用旧路径,php think optimize:schema 或模型调用时会抛出 Class 'think\model\SoftDelete' not found。
$deleteTime 字段默认值不再自动设为 NULL,需显式声明或配合 $defaultSoftDelete
TP5.0 允许只设 $deleteTime = 'delete_time',框架会自动把未删除记录的该字段设为 NULL;TP5.1 要求更严格:
- 如果数据库字段类型是
DATETIME或TIMESTAMP且允许NULL,保留$deleteTime = 'delete_time'即可 - 如果字段类型是
INT(如时间戳整数),必须加protected $defaultSoftDelete = 0;,否则软删除操作会写入0000-00-00 00:00:00导致 MySQL strict 模式报错 - 迁移前检查表结构:
SHOW COLUMNS FROM user LIKE 'delete_time';,确认是否NULL和默认值
withTrashed() 和 onlyTrashed() 返回结果类型变更,链式调用需注意上下文
TP5.0 中 withTrashed() 返回的是模型实例集合,TP5.1 统一返回 Query 对象,这意味着:
-
UserModel::withTrashed()->find(1)仍有效 -
UserModel::withTrashed()->select()有效,但结果是Collection而非数组,遍历时不能直接用foreach ($list as $item)假设$item是数组 —— 它是模型对象 - 若需数组格式,显式调用
->toArray():UserModel::withTrashed()->select()->toArray() -
onlyTrashed()后不能再接where()等条件(除非先->query()),否则可能被忽略
最容易被忽略的是:软删除启用后,所有未显式调用 withTrashed() 的查询都会自动追加 WHERE delete_time IS NULL 条件。如果你在 TP5.0 里靠手动 where('delete_time', null) 控制,迁移到 TP5.1 后要删掉这类冗余条件,否则变成双重过滤,可能查不到数据。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











