如何设置Laravel模型作用域实现全局与局部查询范围?
- 内容介绍
- 文章标签
- 相关推荐
本文共计983个文字,预计阅读时间需要4分钟。
模型以下内容为模型生成的结果,直接输出,不包含图片解释,不涉及数字,不超过100字。
全局作用域必须注册到 boot 方法里才生效
很多人把全局作用域类写好了,却在模型里漏掉 static::addGlobalScope() 调用,结果查出来的数据完全没受限制。
- 必须在模型的
boot静态方法中注册,不能放在构造函数或其它任意位置 - 注册顺序影响最终 SQL:后注册的作用域会包裹在先注册的外层(类似中间件洋葱模型)
- 如果用了软删除(
SoftDeletes),Laravel 自动加了where deleted_at is null,你的全局作用域会套在这个条件外面,可能意外屏蔽掉本该查到的数据
class User extends Model { protected static function boot() { parent::boot(); static::addGlobalScope(new ActiveUserScope()); // ✅ 正确位置 } }
局部作用域命名要带 scope 前缀,且只能用静态方法
不加 scope 前缀,Eloquent 就不认识这是作用域;写成实例方法(public function),调用时直接报错 Call to undefined method。
本文共计983个文字,预计阅读时间需要4分钟。
模型以下内容为模型生成的结果,直接输出,不包含图片解释,不涉及数字,不超过100字。
全局作用域必须注册到 boot 方法里才生效
很多人把全局作用域类写好了,却在模型里漏掉 static::addGlobalScope() 调用,结果查出来的数据完全没受限制。
- 必须在模型的
boot静态方法中注册,不能放在构造函数或其它任意位置 - 注册顺序影响最终 SQL:后注册的作用域会包裹在先注册的外层(类似中间件洋葱模型)
- 如果用了软删除(
SoftDeletes),Laravel 自动加了where deleted_at is null,你的全局作用域会套在这个条件外面,可能意外屏蔽掉本该查到的数据
class User extends Model { protected static function boot() { parent::boot(); static::addGlobalScope(new ActiveUserScope()); // ✅ 正确位置 } }
局部作用域命名要带 scope 前缀,且只能用静态方法
不加 scope 前缀,Eloquent 就不认识这是作用域;写成实例方法(public function),调用时直接报错 Call to undefined method。

