在laravel中恢复软删除记录需先启用softdeletes trait,再用withoutglobalscope(softdeletes::class)绕过全局作用域查询,最后调用restore()并验证deleted_at是否置为null。

在Laravel中执行嵌套查询时恢复已被软删除的记录,需绕过默认的全局作用域限制,否则whereHas、withCount等关联查询会自动过滤掉trashed数据,导致无法查到已删除但应被恢复的目标行。
确认模型启用软删除
打开对应Eloquent模型文件(如App\Models\Post.php),检查是否引入了SoftDeletes trait且$dates数组包含deleted_at。
若未启用,需添加use Illuminate\Database\Eloquent\SoftDeletes;并修改class声明为class Post extends Model { use SoftDeletes; },否则restore()将无效果。
在嵌套查询中显式包含软删除记录
方法一:使用withoutGlobalScopes()临时禁用所有全局作用域
Post::withoutGlobalScopes()->where('id', 123)->first();
方法二:仅禁用SoftDeletes作用域(推荐)
Post::withoutGlobalScope(SoftDeletes::class)->where('id', 123)->first();
方法三:在关联查询中对子查询单独解除作用域——例如查找“作者已软删除但文章仍存在”的用户
User::whereDoesntHave('posts', function ($query) { $query->withoutGlobalScope(SoftDeletes::class)->whereNotNull('deleted_at'); })->get();
执行恢复操作
第一步:查出目标软删除记录
$post = Post::withTrashed()->find(123);
第二步:调用restore()方法
$post->restore();
第三步:验证deleted_at字段是否已置为null
这一步不能跳过,因为restore()不会抛出异常即使失败;若模型未启用SoftDeletes或数据库字段类型不匹配(比如deleted_at是INT而非TIMESTAMP/NULL),【deleted_at字段将保持原值不变,看似成功实则未恢复】。











