Laravel中如何设置全局作用域来自动过滤特定数据?
- 内容介绍
- 文章标签
- 相关推荐
本文共计802个文字,预计阅读时间需要4分钟。
全局
GlobalScope 是什么,为什么它总在“看不见的地方”起作用
它不是一个配置项,也不是中间件,而是一个实现了 Illuminate\Database\Eloquent\Scope 接口的类,在模型 boot() 阶段通过 addGlobalScope() 注册后,就会被 Eloquent 查询构建器自动调用。它的 apply() 方法接收 Builder 和 Model 实例,允许你直接修改 SQL 条件。
常见现象包括:
- 明明数据库里有 status = 0 的记录,
User::all()却查不到 - 后台需要查看“已删除”用户,但
User::withTrashed()不生效——可能是因为自定义作用域和SoftDeletingScope冲突 - 多租户系统中,
Order::where('id', 123)->first()返回 null,实际是 tenant_id 没匹配上,但错误不报
如何正确注册一个 GlobalScope(以租户隔离为例)
不能在控制器或服务里临时加 where,必须从模型层统一控制。推荐使用独立作用域类而非闭包,便于复用和测试。
本文共计802个文字,预计阅读时间需要4分钟。
全局
GlobalScope 是什么,为什么它总在“看不见的地方”起作用
它不是一个配置项,也不是中间件,而是一个实现了 Illuminate\Database\Eloquent\Scope 接口的类,在模型 boot() 阶段通过 addGlobalScope() 注册后,就会被 Eloquent 查询构建器自动调用。它的 apply() 方法接收 Builder 和 Model 实例,允许你直接修改 SQL 条件。
常见现象包括:
- 明明数据库里有 status = 0 的记录,
User::all()却查不到 - 后台需要查看“已删除”用户,但
User::withTrashed()不生效——可能是因为自定义作用域和SoftDeletingScope冲突 - 多租户系统中,
Order::where('id', 123)->first()返回 null,实际是 tenant_id 没匹配上,但错误不报
如何正确注册一个 GlobalScope(以租户隔离为例)
不能在控制器或服务里临时加 where,必须从模型层统一控制。推荐使用独立作用域类而非闭包,便于复用和测试。

