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 】
相关推荐:
Laravel怎么连接多个数据库_Laravel多数据库连接配置
Python自动化办公教程_ExcelWordPDF批量处理案例
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
中山网站推广排名,中山信息港登录入口?
Linux后台任务运行方法_nohup与&使用技巧【技巧】
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
如何快速选择适合个人网站的云服务器配置?
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
黑客如何利用漏洞与弱口令入侵网站服务器?
如何生成腾讯云建站专用兑换码?
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
微信小程序 require机制详解及实例代码
如何快速生成凡客建站的专业级图册?
香港服务器租用每月最低只需15元?
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
如何快速搭建高效WAP手机网站吸引移动用户?
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
Laravel如何实现本地化和多语言支持?(i18n教程)
制作旅游网站html,怎样注册旅游网站?
EditPlus中的正则表达式实战(5)
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
详解Android——蓝牙技术 带你实现终端间数据传输
零基础网站服务器架设实战:轻量应用与域名解析配置指南
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
创业网站制作流程,创业网站可靠吗?
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
jquery插件bootstrapValidator表单验证详解
如何在阿里云完成域名注册与建站?
Laravel如何使用Gate和Policy进行授权?(权限控制)
Laravel集合Collection怎么用_Laravel集合常用函数详解
如何在建站之星绑定自定义域名?
千库网官网入口推荐 千库网设计创意平台入口
Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
使用Dockerfile构建java web环境
济南网站建设制作公司,室内设计网站一般都有哪些功能?
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
常州企业网站制作公司,全国继续教育网怎么登录?
WordPress 子目录安装中正确处理脚本路径的完整指南
php485函数参数是什么意思_php485各参数详细说明【介绍】
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
上一篇:如何快速搭建安全的FTP站点?
上一篇:如何快速搭建安全的FTP站点?


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