Laravel中如何设置全局作用域来自动过滤特定数据?

2026-05-07 18:270阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计802个文字,预计阅读时间需要4分钟。

Laravel中如何设置全局作用域来自动过滤特定数据?

全局

GlobalScope 是什么,为什么它总在“看不见的地方”起作用

它不是一个配置项,也不是中间件,而是一个实现了 Illuminate\Database\Eloquent\Scope 接口的类,在模型 boot() 阶段通过 addGlobalScope() 注册后,就会被 Eloquent 查询构建器自动调用。它的 apply() 方法接收 BuilderModel 实例,允许你直接修改 SQL 条件。

常见现象包括:

  • 明明数据库里有 status = 0 的记录,User::all() 却查不到
  • 后台需要查看“已删除”用户,但 User::withTrashed() 不生效——可能是因为自定义作用域和 SoftDeletingScope 冲突
  • 多租户系统中,Order::where('id', 123)->first() 返回 null,实际是 tenant_id 没匹配上,但错误不报

如何正确注册一个 GlobalScope(以租户隔离为例)

不能在控制器或服务里临时加 where,必须从模型层统一控制。推荐使用独立作用域类而非闭包,便于复用和测试。

阅读全文

本文共计802个文字,预计阅读时间需要4分钟。

Laravel中如何设置全局作用域来自动过滤特定数据?

全局

GlobalScope 是什么,为什么它总在“看不见的地方”起作用

它不是一个配置项,也不是中间件,而是一个实现了 Illuminate\Database\Eloquent\Scope 接口的类,在模型 boot() 阶段通过 addGlobalScope() 注册后,就会被 Eloquent 查询构建器自动调用。它的 apply() 方法接收 BuilderModel 实例,允许你直接修改 SQL 条件。

常见现象包括:

  • 明明数据库里有 status = 0 的记录,User::all() 却查不到
  • 后台需要查看“已删除”用户,但 User::withTrashed() 不生效——可能是因为自定义作用域和 SoftDeletingScope 冲突
  • 多租户系统中,Order::where('id', 123)->first() 返回 null,实际是 tenant_id 没匹配上,但错误不报

如何正确注册一个 GlobalScope(以租户隔离为例)

不能在控制器或服务里临时加 where,必须从模型层统一控制。推荐使用独立作用域类而非闭包,便于复用和测试。

阅读全文