laravel 11 中可安全绕过全局作用域:用 withoutglobalscope(类名) 移除指定作用域(如 softdeletingscope),withoutglobalscopes() 移除全部,withoutglobalscope('key') 移除闭包作用域;find/first 等主键查询本就不受作用域影响。

在 Laravel 11 中,模型全局作用域(Global Scope)默认会对所有 Eloquent 查询(如 get()、first()、where() 等)自动附加约束。若需临时绕过某个或全部作用域,Laravel 提供了明确、安全的移除方式。
只移除指定的全局作用域
这是最常用也最推荐的做法,尤其当你只想跳过软删除(SoftDeletingScope),但保留租户隔离、状态过滤等其他作用域时:
- 使用
withoutGlobalScope(作用域类),传入具体作用域类名 - 例如禁用软删除作用域:
User::withoutGlobalScope(SoftDeletingScope::class)->get(); - 对链式查询完全友好:
User::where('role', 'admin')->withoutGlobalScope(SoftDeletingScope::class)->first();
移除所有全局作用域
适用于后台管理、数据迁移或调试场景,但需格外谨慎——它会同时移除软删除、租户、状态等所有已注册的作用域:
- 调用
withoutGlobalScopes()即可:
User::withoutGlobalScopes()->get(); - 该方法不带参数,效果是“全关”,业务逻辑必须自行处理软删、多租户等原本由作用域保障的过滤逻辑
移除匿名闭包定义的全局作用域
如果你在模型中用闭包方式注册了作用域(如 addGlobalScope('active', function ($builder) { ... })),移除时需传入对应键名:
- User::withoutGlobalScope('active')->get();
- 键名必须与注册时完全一致,且为字符串;不能传闭包本身
注意事项和常见陷阱
-
find()、findOrFail()、first()等主键直查方法本身不经过全局作用域 —— 所以它们不会受withoutGlobalScope()影响,也不需要移除 - 调用
restore()前不要用withoutGlobalScope()加载模型,否则$user->trashed()返回false,导致恢复失败 - 移除后查出的数据包含已软删记录,业务代码应主动判断:
if (!$user->trashed()) { ... } - 关联查询(如
with('posts'))不受父模型作用域影响,子模型是否启用作用域需单独控制











