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 默认使用
SoftDeletestrait 添加全局作用域,隐藏已删除记录。 -
多租户系统:为每个用户或组织的数据自动加上
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 】
相关推荐:
php json中文编码为null的解决办法
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
米侠浏览器网页背景异常怎么办 米侠显示修复
如何在Windows环境下新建FTP站点并设置权限?
如何用y主机助手快速搭建网站?
简历没回改:利用AI润色让你的文字更专业
Python文件操作最佳实践_稳定性说明【指导】
网站制作软件有哪些,制图软件有哪些?
做企业网站制作流程,企业网站制作基本流程有哪些?
如何做网站制作流程,*游戏网站怎么搭建?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
详解CentOS6.5 安装 MySQL5.1.71的方法
网站优化排名时,需要考虑哪些问题呢?
如何快速生成高效建站系统源代码?
如何快速建站并高效导出源代码?
如何解决hover在ie6中的兼容性问题
Swift中switch语句区间和元组模式匹配
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
JavaScript如何操作视频_媒体API怎么控制播放
Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
进行网站优化必须要坚持的四大原则
Linux系统命令中screen命令详解
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
免费视频制作网站,更新又快又好的免费电影网站?
如何用免费手机建站系统零基础打造专业网站?
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
如何挑选高效建站主机与优质域名?
黑客如何通过漏洞一步步攻陷网站服务器?
简单实现jsp分页
phpredis提高消息队列的实时性方法(推荐)
北京专业网站制作设计师招聘,北京白云观官方网站?
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
如何在云主机上快速搭建网站?
在线制作视频的网站有哪些,电脑如何制作视频短片?
微信小程序 五星评分(包括半颗星评分)实例代码
Laravel如何创建自定义Facades?(详细步骤)
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
米侠浏览器网页图片不显示怎么办 米侠图片加载修复
详解jQuery中基本的动画方法
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
如何正确下载安装西数主机建站助手?


nction (Builder $builder) {
$builder->where('status', 'active');
});
}