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 】
相关推荐:
b2c电商网站制作流程,b2c水平综合的电商平台?
javascript中闭包概念与用法深入理解
如何快速生成橙子建站落地页链接?
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
Swift开发中switch语句值绑定模式
如何在云指建站中生成FTP站点?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
网站制作软件有哪些,制图软件有哪些?
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
北京的网站制作公司有哪些,哪个视频网站最好?
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
在线制作视频的网站有哪些,电脑如何制作视频短片?
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
Laravel怎么清理缓存_Laravel optimize clear命令详解
Laravel如何使用Livewire构建动态组件?(入门代码)
如何用虚拟主机快速搭建网站?详细步骤解析
如何快速搭建安全的FTP站点?
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
PHP 500报错的快速解决方法
Android利用动画实现背景逐渐变暗
油猴 教程,油猴搜脚本为什么会网页无法显示?
JavaScript如何实现继承_有哪些常用方法
高端云建站费用究竟需要多少预算?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
北京网站制作的公司有哪些,北京白云观官方网站?
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
微信小程序 scroll-view组件实现列表页实例代码
node.js报错:Cannot find module 'ejs'的解决办法
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
香港服务器部署网站为何提示未备案?
如何快速搭建高效香港服务器网站?
如何做网站制作流程,*游戏网站怎么搭建?
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
java中使用zxing批量生成二维码立牌
Thinkphp 中 distinct 的用法解析
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程
企业网站制作这些问题要关注
C++用Dijkstra(迪杰斯特拉)算法求最短路径
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框
如何用JavaScript实现文本编辑器_光标和选区怎么处理
如何续费美橙建站之星域名及服务?
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
上一篇:如何快速搭建安全的FTP站点?
上一篇:如何快速搭建安全的FTP站点?


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