Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南

发布时间 - 2025-12-16 00:00:00    点击率:
全局作用域是Laravel中为模型所有查询自动添加约束的机制,如状态过滤或多租户隔离;通过实现Scope接口或使用闭包定义,可在模型的boot方法中注册,例如ActiveScope限制仅查询激活用户;系统自带软删除即基于此机制,默认添加deleted_at为null条件;可通过withoutGlobalScope移除指定或全部作用域以查询完整数据。

在 Laravel 的 Eloquent ORM 中,全局作用域(Global Scopes)是一种为模型的所有查询自动添加约束条件的机制。它让你无需每次手动写 where 条件,就能实现诸如“软删除”、“多租户数据隔离”或“状态过滤”等功能。

什么是全局作用域

全局作用域会作用于该模型的每一个查询操作,包括关系查询、静态调用以及链式调用。比如你有一个 User 模型,默认只希望获取状态为“激活”的用户,就可以通过全局作用域统一处理。

Laravel 自带的软删除功能就是基于全局作用域实现的 —— 它自动在所有查询中加入 where null deleted_at 条件。

如何定义和使用全局作用域

创建全局作用域有多种方式,最常见的是使用作用域类或匿名全局作用域。

1. 使用作用域类(推荐)

首先创建一个实现 Illuminate\Database\Eloquent\Scope 接口的类:

php artisan make:scope ActiveScope

然后编辑生成的类:

where('status', 'active');
    }
}

接着在模型中注册这个全局作用域:



2. 使用闭包定义匿名全局作用域

如果逻辑简单,也可以直接在模型中使用闭包:

protected static function boot()
{
    parent::boot();

    static::addGlobalScope('active', function (Builder $builder) {
        $builder->where('status', 'active');
    });
}

移除全局作用域

有时候你需要绕过某个全局作用域,比如查看所有用户(包括非活跃的)。可以使用 withoutGlobalScope() 方法:

// 移除单个作用域
User::withoutGlobalScope(ActiveScope::class)->get();

// 移除多个作用域
User::withoutGlobalScopes([ActiveScope::class, AnotherScope::class])->get();

// 移除全部全局作用域
User::withoutGlobalScopes()->get();

如果你是用字符串命名的匿名作用域,也可以通过名称移除:

User::withoutGlobalScope('active')->get();

实际应用场景

  • 软删除控制:Laravel 默认使用 SoftDeletes trait 添加全局作用域,隐藏已删除记录。
  • 多租户系统:为每个用户或组织的数据自动加上 tenant_id 条件。
  • 环境隔离:开发/测试环境下允许看到测试数据,生产环境默认过滤。
  • 状态过滤:如文章模型默认只查发布状态的文章。

例如,在多租户应用中:

class TenantScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        if (auth()->check()) {
            $builder->where('tenant_id', auth()->user()->tenant_id);
        }
    }
}

这样每个查询都会自动带上当前用户的租户 ID,避免数据越权访问。

基本上就这些。全局作用域是构建安全、可维护 Laravel 应用的重要工具,合理使用能大幅减少重复代码,提升数据一致性。


# laravel  # php  # app  # 工具  # ai  # 作用域  # NULL  # 字符串  # 接口  # 闭包  # database  # 移除  # 链式  # 的是  # 是一种  # 让你  # 你是  # 就能  # 多个  # 你有  # 可以通过 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251811 】 【 AI营销90571


相关推荐: Laravel如何升级到最新版本?(升级指南和步骤)  如何用花生壳三步快速搭建专属网站?  香港服务器选型指南:免备案配置与高效建站方案解析  如何快速生成凡客建站的专业级图册?  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  米侠浏览器网页背景异常怎么办 米侠显示修复  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  如何在IIS中新建站点并配置端口与IP地址?  电商网站制作价格怎么算,网上拍卖流程以及规则?  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  如何彻底删除建站之星生成的Banner?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  清除minerd进程的简单方法  制作公司内部网站有哪些,内网如何建网站?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  如何快速重置建站主机并恢复默认配置?  如何彻底卸载建站之星软件?  如何在阿里云部署织梦网站?  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  JS经典正则表达式笔试题汇总  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  Laravel如何集成Inertia.js与Vue/React?(安装配置)  Laravel如何实现数据库事务?(DB Facade示例)  微信小程序 五星评分(包括半颗星评分)实例代码  LinuxShell函数封装方法_脚本复用设计思路【教程】  js代码实现下拉菜单【推荐】  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  如何快速建站并高效导出源代码?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  深圳网站制作的公司有哪些,dido官方网站?  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  如何在IIS中配置站点IP、端口及主机头?  如何在搬瓦工VPS快速搭建网站?  如何用PHP快速搭建CMS系统?  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  浅述节点的创建及常见功能的实现  中山网站推广排名,中山信息港登录入口?  javascript如何操作浏览器历史记录_怎样实现无刷新导航  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  iOS UIView常见属性方法小结  如何用狗爹虚拟主机快速搭建网站?  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】