在phpmyadmin中直接清空deleted_at字段无效,因laravel自动添加deleted_at is null条件;彻底删除需用forcedelete()或先设null再执行带deleted_at is not null条件的delete语句。
phpmyadmin里直接删掉软删除记录的deleted_at字段值没用
软删除不是真删,只是给deleted_at字段填了时间戳。你在 phpmyadmin 里手动把某行的deleted_at改成null或清空,laravel 查询时仍会过滤掉——因为框架默认只查deleted_at is null的记录,且模型启用了softdeletes trait 后,所有where、find、get都会自动加这个条件。
想在 phpMyAdmin 彻底清除,得先关掉 Laravel 的软删除约束
直接进数据库删数据前,必须绕过 Laravel 的查询拦截。最稳妥的方式不是改数据库,而是用 Artisan 命令:运行php artisan tinker,然后执行:
App\Models\YourModel::withTrashed()->where('id', 123)->forceDelete();
如果非要在 phpMyAdmin 操作(比如没 CLI 权限),需满足两个条件:
- 确保该模型没启用全局作用域(检查
boot方法里有没有static::addGlobalScope) - 删之前,先手动把
deleted_at设为NULL,再执行DELETE FROM your_table WHERE id = 123 AND deleted_at IS NOT NULL(注意:不能只删WHERE id = 123,否则可能误删正常数据)
withTrashed()和onlyTrashed()在 phpMyAdmin 里不生效
这两个是 Eloquent 方法,只在 PHP 代码里起作用。phpMyAdmin 是纯 SQL 界面,不解析 Laravel 的模型逻辑。你在里面看到的全是原始表数据,包括deleted_at非空的行——但它们不会出现在 Laravel 的get()结果里,除非你显式调用withTrashed()。
常见误操作:
- 在 phpMyAdmin 里选中“已删除”行 → 点“删除” → 实际执行的是普通
DELETE,但 Laravel 下次查时仍会忽略它(因为没走模型生命周期,事务/事件/观察者全失效) - 导出 SQL 时勾选了“包含
deleted_at非空行”,但导入后没清缓存,导致页面还是看不到
彻底清除前务必确认关联数据是否也被软删除
比如Post软删了,它的comments可能还在,但Comment::where('post_id', $post->id)->delete()只会设deleted_at,不会级联物理删除。要真清干净:
- 先查
SELECT * FROM comments WHERE post_id = 123 AND deleted_at IS NOT NULL - 再用
DELETE FROM comments WHERE post_id = 123 AND deleted_at IS NOT NULL - 最后删
posts主表对应行
外键约束设为CASCADE也没用——软删除不触发ON DELETE CASCADE,它根本不是DELETE语句。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











