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 】
【
网络技术251811 】
【
AI营销90571 】
相关推荐:
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
🚀拖拽式CMS建站能否实现高效与个性化并存?
网站制作免费,什么网站能看正片电影?
如何在阿里云部署织梦网站?
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
Java垃圾回收器的方法和原理总结
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
Python结构化数据采集_字段抽取解析【教程】
如何快速查询网站的真实建站时间?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
教你用AI将一段旋律扩展成一首完整的曲子
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
Laravel如何保护应用免受CSRF攻击?(原理和示例)
图册素材网站设计制作软件,图册的导出方式有几种?
Laravel中的Facade(门面)到底是什么原理
实现点击下箭头变上箭头来回切换的两种方法【推荐】
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
香港服务器WordPress建站指南:SEO优化与高效部署策略
Windows Hello人脸识别突然无法使用
如何自定义建站之星模板颜色并下载新样式?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
使用spring连接及操作mongodb3.0实例
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
如何用AI帮你把自己的生活经历写成一个有趣的故事?
JS实现鼠标移上去显示图片或微信二维码
如何构建满足综合性能需求的优质建站方案?
phpredis提高消息队列的实时性方法(推荐)
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
深圳网站制作的公司有哪些,dido官方网站?
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
iOS正则表达式验证手机号、邮箱、身份证号等
Linux后台任务运行方法_nohup与&使用技巧【技巧】
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
C#如何调用原生C++ COM对象详解
如何正确选择百度移动适配建站域名?
Laravel如何实现API速率限制?(Rate Limiting教程)
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
怎么用AI帮你为初创公司进行市场定位分析?
如何在阿里云ECS服务器部署织梦CMS网站?
上一篇:如何快速搭建安全的FTP站点?
上一篇:如何快速搭建安全的FTP站点?


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