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 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  制作企业网站建设方案,怎样建设一个公司网站?  电商网站制作价格怎么算,网上拍卖流程以及规则?  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  Laravel如何使用Blade模板引擎?(完整语法和示例)  如何快速启动建站代理加盟业务?  html5的keygen标签为什么废弃_替代方案说明【解答】  微信小程序制作网站有哪些,微信小程序需要做网站吗?  黑客如何利用漏洞与弱口令入侵网站服务器?  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  如何快速搭建自助建站会员专属系统?  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  打造顶配客厅影院,这份100寸电视推荐名单请查收  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  制作电商网页,电商供应链怎么做?  公司网站制作价格怎么算,公司办个官网需要多少钱?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  如何在VPS电脑上快速搭建网站?  zabbix利用python脚本发送报警邮件的方法  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  如何登录建站主机?访问步骤全解析  微信小程序 闭包写法详细介绍  Laravel如何集成Inertia.js与Vue/React?(安装配置)  如何在七牛云存储上搭建网站并设置自定义域名?  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  如何用低价快速搭建高质量网站?  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  如何选择可靠的免备案建站服务器?  html如何与html链接_实现多个HTML页面互相链接【互相】  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  大连网站制作公司哪家好一点,大连买房网站哪个好?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  什么是javascript作用域_全局和局部作用域有什么区别?  Laravel如何实现数据库事务?(DB Facade示例)  Bootstrap CSS布局之列表  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  黑客如何通过漏洞一步步攻陷网站服务器?  如何快速生成凡客建站的专业级图册?  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  Laravel如何使用withoutEvents方法临时禁用模型事件  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  php打包exe后无法访问网络共享_共享权限设置方法【教程】