直接将 deleted_at 设为 null 即可恢复软删除数据,但需在 phpmyadmin 中勾选“null”而非仅清空输入框,并用 sql 验证恢复结果;laravel 中应调用 restore() 方法确保状态同步与事件触发。
直接恢复 deleted_at 为空就能“复活”数据
软删除不是真删,只是把 deleted_at 字段设为当前时间戳。只要把它清空(设为 null),laravel 就会重新查到这条记录。phpmyadmin 里改这个字段比写 php 代码还快,但得注意 laravel 的查询默认会自动过滤掉 deleted_at is not null 的行。
在 phpMyAdmin 中手动更新 deleted_at 字段
打开对应数据表 → 找到那条被软删除的记录(deleted_at 列不为空)→ 点击编辑(铅笔图标)→ 把 deleted_at 输入框里的值删干净,留空 → 勾选下方 “NULL” 复选框 → 点“执行”。
常见错误现象:
- 只清空输入框但没勾 “NULL”,结果存成空字符串
'',Laravel 仍视为已删除 - 误填
0、1970-01-01 00:00:00或0000-00-00 00:00:00,这些都不是NULL,无效 - 用搜索功能查
deleted_at != NULL找不到记录?其实是 phpMyAdmin 默认隐藏了NULL值列,换用 SQL 查询更可靠
确认恢复是否生效:别只信 phpMyAdmin 的显示
phpMyAdmin 表格视图有时缓存或渲染异常,显示 deleted_at 为空,但实际没提交成功。最稳的验证方式是直接跑一条 SQL:
SELECT * FROM `users` WHERE `id` = 123 AND `deleted_at` IS NULL;
如果返回一行,说明恢复成功;再在 Laravel 中调用 User::withTrashed()->find(123) 查一下原始状态,确保 trashed() 返回 false。
使用场景提醒:
- 仅适用于你确定该记录不该被删除,且没其他外键/业务逻辑依赖其删除态
- 如果模型启用了
forceDelete()或数据库触发器硬删了关联数据,单改deleted_at不够 - 批量恢复?别在 phpMyAdmin 里一页页点,用 SQL:
UPDATE `posts` SET `deleted_at` = NULL WHERE `id` IN (101,102,105);
Laravel 层面要同步刷新缓存和关系
改完数据库后,Laravel 的 Eloquent 实例可能还拿着旧状态。比如你之前用 User::find(123) 查过,它缓存了 trashed = true;或者 Model 的 $casts 或访问器对 deleted_at 做了处理,导致判断失准。
实操建议:
- 重启队列监听器或 Horizon(如果它们缓存了模型实例)
- 避免复用旧 Model 实例,改用
User::withTrashed()->find(123)->restore()主动触发 restore 逻辑,它会重置状态并触发事件 - 检查是否有 Observer 监听了
restoring或restored,某些清理逻辑可能意外干扰
真正麻烦的不是怎么点 phpMyAdmin,而是恢复后业务流程是否还信任这条数据——比如订单状态机、权限校验、API 缓存键是否跟着变了。这些没法靠改一个字段解决。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











