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 】
相关推荐:
如何快速辨别茅台真假?关键步骤解析
大连 网站制作,大连天途有线官网?
如何正确选择百度移动适配建站域名?
Laravel怎么判断请求类型_Laravel Request isMethod用法
如何在IIS服务器上快速部署高效网站?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
微信公众帐号开发教程之图文消息全攻略
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
如何快速搭建自助建站会员专属系统?
Laravel如何升级到最新版本?(升级指南和步骤)
Laravel怎么调用外部API_Laravel Http Client客户端使用
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
移动端脚本框架Hammer.js
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
Laravel观察者模式如何使用_Laravel Model Observer配置
Python3.6正式版新特性预览
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
中山网站制作网页,中山新生登记系统登记流程?
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
无锡营销型网站制作公司,无锡网选车牌流程?
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
html如何与html链接_实现多个HTML页面互相链接【互相】
如何在云服务器上快速搭建个人网站?
Laravel如何处理表单验证?(Requests代码示例)
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
清除minerd进程的简单方法
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
如何在阿里云服务器自主搭建网站?
打造顶配客厅影院,这份100寸电视推荐名单请查收
微信小程序制作网站有哪些,微信小程序需要做网站吗?
Laravel Session怎么存储_Laravel Session驱动配置详解
Laravel如何使用Service Container和依赖注入?(代码示例)
香港服务器网站推广:SEO优化与外贸独立站搭建策略
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
,南京靠谱的征婚网站?
Laravel如何使用Livewire构建动态组件?(入门代码)
Android中AutoCompleteTextView自动提示
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
javascript如何操作浏览器历史记录_怎样实现无刷新导航
linux写shell需要注意的问题(必看)
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
网站建设要注意的标准 促进网站用户好感度!
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
Android滚轮选择时间控件使用详解


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