Laravel如何实现模型的全局作用域?(Global Scope示例)

发布时间 - 2025-12-13 00:00:00    点击率:
全局作用域用于为模型所有查询自动添加约束条件,如状态过滤;需实现Scope接口并重写apply方法,在模型boot中用addGlobalScope注册,可用withoutGlobalScopes等方法临时取消。

在 Laravel 中,全局作用域(Global Scope)用于为模型的所有查询自动添加约束条件,比如软删除、多租户隔离、状态过滤等。它比在每个查询中手动加 where 更安全、更统一。

定义全局作用域类

创建一个实现 Illuminate\Database\Eloquent\Scope 接口的类,重写 apply() 方法,在这里编写你要注入的查询逻辑:

namespace App\Scopes;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;

class ActiveScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder->where('status', 'active');
    }
}

在模型中注册全局作用域

在模型的 boot() 方法中调用 addGlobalScope() 注册作用域:

namespace App\Models;

use App\Scopes\ActiveScope;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope(new ActiveScope());
    }
}

此后所有对 Post 的查询(如 Post::all()Post::find(1))都会自动加上 WHERE status = 'active'

临时取消全局作用域

某些场景下需要绕过全局作用域,比如后台管理或数据迁移,可用以下方式:

  • Post::withoutGlobalScopes()->get():移除全部全局作用域
  • Post::withoutGlobalScope(ActiveScope::class)->get():仅移除指定作用域
  • Post::withTrashed()->get()(如果用了软删除):这是 Laravel 内置的特例,本质也是全局作用域

匿名全局作用域(适合简单逻辑)

不想单独建类?可以直接传闭包:

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

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

注意:用字符串名注册时,取消要用同名,例如 withoutGlobalScope('active')

基本上就这些。全局作用域不复杂但容易忽略——关键在统一性和可维护性,别滥用,也别漏掉清除场景。


# laravel  # app  # 作用域  # 字符串  # 接口  # class  # 闭包  # database  # 重写  # 移除  # 这是  # 在这里  # 你要  # 用了  # 要用  # 可以直接  # 创建一个  # 也别 


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


相关推荐: 原生JS实现图片轮播切换效果  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  Android实现代码画虚线边框背景效果  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  C++用Dijkstra(迪杰斯特拉)算法求最短路径  如何在云主机上快速搭建网站?  如何用狗爹虚拟主机快速搭建网站?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  微信小程序 wx.uploadFile无法上传解决办法  如何快速搭建高效香港服务器网站?  晋江文学城电脑版官网 晋江文学城网页版直接进入  如何自定义建站之星网站的导航菜单样式?  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  零基础网站服务器架设实战:轻量应用与域名解析配置指南  如何在阿里云购买域名并搭建网站?  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  如何用AI帮你把自己的生活经历写成一个有趣的故事?  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  SQL查询语句优化的实用方法总结  如何用免费手机建站系统零基础打造专业网站?  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  Laravel如何使用模型观察者?(Observer代码示例)  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  如何基于云服务器快速搭建网站及云盘系统?  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  JavaScript如何实现音频处理_Web Audio API如何工作?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  如何获取免费开源的自助建站系统源码?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  Laravel安装步骤详细教程_Laravel环境搭建指南  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  详解jQuery中的事件  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  如何用美橙互联一键搭建多站合一网站?  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  javascript基本数据类型及类型检测常用方法小结  LinuxShell函数封装方法_脚本复用设计思路【教程】  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明