ThinkPHP6中全局查询范围可通过withoutGlobalScope()动态关闭:不传参则禁用全部,传数组可指定禁用项;必须在查询链开头调用,仅影响当次查询。

ThinkPHP6 中,全局查询范围(global scope)一旦定义,就会自动附加到该模型的所有查询中。若某次查询需要跳过这些全局条件,不能靠删代码或改配置,而是要用 withoutGlobalScope() 方法动态关闭。
单独查询时关闭全部全局作用域
直接调用 withoutGlobalScope(),不传参数,即可临时禁用模型上所有已注册的全局作用域:
User::withoutGlobalScope()->find(1);<br>User::withoutGlobalScope()->select();<br>User::withoutGlobalScope()->where('name', 'admin')->select();
此时生成的 SQL 不会包含任何全局 where 条件(比如 status=1、tenant_id=xxx 等)。
单独查询时只关闭指定的全局作用域
如果模型注册了多个全局作用域(如 ['status', 'tenant']),但只想跳过其中某一个,可传入作用域名数组:
立即学习“PHP免费学习笔记(深入)”;
// 只关闭 status 全局作用域,保留 tenant<br>User::withoutGlobalScope(['status'])->select();<br><br>// 关闭 status 和 tenant 两个,但不关其他可能存在的<br>User::withoutGlobalScope(['status', 'tenant'])->find(5);
注意点与常见误区
- 必须在查询链最开始调用
withoutGlobalScope(),比如User::withoutGlobalScope()->where(...)->select(),写在中间或末尾无效 - 它只影响当次查询,不会改变模型的全局配置,后续查询仍按原规则执行
- 若使用了自定义作用域类(如
TenantScope),需确保其已通过addGlobalScope()正确注册,否则withoutGlobalScope()无作用对象 - 不要和
useGlobalScope(false)混淆——后者是模型实例方法,且会彻底禁用所有作用域(包括后续手动加的),风险更高,不推荐用于单次控制



















