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


相关推荐: Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  如何在服务器上三步完成建站并提升流量?  如何快速生成凡客建站的专业级图册?  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  大连 网站制作,大连天途有线官网?  深圳网站制作培训,深圳哪些招聘网站比较好?  使用豆包 AI 辅助进行简单网页 HTML 结构设计  个人网站制作流程图片大全,个人网站如何注销?  太平洋网站制作公司,网络用语太平洋是什么意思?  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  Python文本处理实践_日志清洗解析【指导】  如何在VPS电脑上快速搭建网站?  如何用AWS免费套餐快速搭建高效网站?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  如何在新浪SAE免费搭建个人博客?  如何在阿里云虚拟主机上快速搭建个人网站?  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  Laravel如何自定义分页视图?(Pagination示例)  Internet Explorer官网直接进入 IE浏览器在线体验版网址  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  微信公众帐号开发教程之图文消息全攻略  如何用搬瓦工VPS快速搭建个人网站?  Laravel如何升级到最新版本?(升级指南和步骤)  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  iOS UIView常见属性方法小结  网站建设保证美观性,需要考虑的几点问题!  Laravel模型事件有哪些_Laravel Model Event生命周期详解  Python制作简易注册登录系统  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  ,南京靠谱的征婚网站?  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  js代码实现下拉菜单【推荐】  轻松掌握MySQL函数中的last_insert_id()  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  Laravel如何使用Blade组件和插槽?(Component代码示例)  黑客如何利用漏洞与弱口令入侵网站服务器?  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  油猴 教程,油猴搜脚本为什么会网页无法显示?  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】