加了 SoftDeletes trait 还查不到 deleted_at 字段是因为该 trait 仅启用软删除逻辑,不自动添加数据库字段;必须手动创建迁移并使用 $table->softDeletes() 添加 deleted_at 字段。
为什么加了 SoftDeletes trait 还查不到 deleted_at 字段
因为
只是启用软删除逻辑,不会自动在数据库中添加
字段。必须手动迁移添加:
运行
在迁移文件的
方法里写:
执行
注意:如果表已存在且有数据,
会添加可为 NULL 的
字段;但不会修改已有记录的该字段值,所以历史数据默认不被视为“已删除”。
调用 delete() 后数据没消失但 where 查询查不到
这是软删除的预期行为:调用
会把
设为当前时间戳,而非真正删掉行。Laravel 默认的 Eloquent 查询会自动加上
条件。
想查出所有记录(含已软删除的):用
只查已软删除的:用
恢复单条:用
(会清空
)
强制物理删除:用
注意:关联查询(如
)默认也不会加载已软删除的关联记录,除非对应模型也用了
并显式调用
。
restore() 不生效或报错 “Call to undefined method”
常见原因有两个:
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
模型没 use
trait,只加了迁移字段没用
调用方式错误:比如对集合批量调用
时没用
,直接写
会失败
正确批量恢复示例:
另外,如果模型启用了全局作用域(如多租户 scope),要确认
是否被拦截 —— 它不触发
/
等事件,但会触发
和
事件。
软删除后关联数据怎么处理:级联 or 保留
Laravel 不自动处理软删除的关联级联。比如
软删除,它的
记录默认仍可查(除非
自己也用了
)。
想让关联也软删除:需手动在模型事件里实现,例如监听
事件,然后调用
想物理删除关联:监听
事件,再执行
避免误恢复时带出脏关联:恢复主模型前,先检查并同步恢复关联模型(需自行编码逻辑)
没有银弹方案。是否级联、怎么级联,得看业务——回收站功能通常要求“主模型恢复时,其软删除的子数据也一并恢复”,这必须自己控制,Eloquent 不代劳。
SoftDeletesdeleted_atphp artisan make:migration add_deleted_at_to_users_tableup()public function up(Blueprint $table)
{
$table->softDeletes();
}php artisan migratesoftDeletes()deleted_at$user->delete()deleted_atWHERE deleted_at IS NULLUser::withTrashed()->get()User::onlyTrashed()->get()$user->restore()deleted_at$user->forceDelete()$user->postsSoftDeleteswithTrashed()Illuminate\Database\Eloquent\SoftDeletesrestore()each()$users->restore()$users = User::onlyTrashed()->where('created_at', '<', now()->subWeek())->get();
$users->each->restore(); // 或 $users->each(function ($u) { $u->restore(); });restore()creatingupdatingrestoringrestoredUserPostPostSoftDeletesdeleting$this->posts()->update(['deleted_at' => now()])forceDeleted$this->posts()->forceDelete()