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) {
$builde
r->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依赖注入与容器绑定说明
上一篇:如何快速搭建安全的FTP站点?
上一篇:如何快速搭建安全的FTP站点?


r->where('status', 'active');
});
}