首页 > php框架 > Laravel > 正文

Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南

穿越時空
发布: 2025-12-16 19:45:36
原创
960人浏览过
全局作用域是Laravel中为模型所有查询自动添加约束的机制,如状态过滤或多租户隔离;通过实现Scope接口或使用闭包定义,可在模型的boot方法中注册,例如ActiveScope限制仅查询激活用户;系统自带软删除即基于此机制,默认添加deleted_at为null条件;可通过withoutGlobalScope移除指定或全部作用域以查询完整数据。

laravel全局作用域是什么_laravel eloquent global scopes应用指南

在 Laravel 的 Eloquent ORM 中,全局作用域(Global Scopes)是一种为模型的所有查询自动添加约束条件的机制。它让你无需每次手动写 where 条件,就能实现诸如“软删除”、“多租户数据隔离”或“状态过滤”等功能。

什么是全局作用域

全局作用域会作用于该模型的每一个查询操作,包括关系查询、静态调用以及链式调用。比如你有一个 User 模型,默认只希望获取状态为“激活”的用户,就可以通过全局作用域统一处理。

Laravel 自带的软删除功能就是基于全局作用域实现的 —— 它自动在所有查询中加入 where null deleted_at 条件。

如何定义和使用全局作用域

创建全局作用域有多种方式,最常见的是使用作用域类或匿名全局作用域。

1. 使用作用域类(推荐)

首先创建一个实现 Illuminate\Database\Eloquent\Scope 接口的类:

php artisan make:scope ActiveScope
登录后复制

然后编辑生成的类:

<?php

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');
    }
}
登录后复制

接着在模型中注册这个全局作用域:

QoQo
QoQo

QoQo是一款专注于UX设计的AI工具,可以帮助UX设计师生成用户角色卡片、用户旅程图、用户访谈问卷等。

QoQo 172
查看详情 QoQo
<?php

namespace App\Models;

use App\Scopes\ActiveScope;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope(new ActiveScope);
    }
}
登录后复制
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 默认使用 SoftDeletes trait 添加全局作用域,隐藏已删除记录。
  • 多租户系统:为每个用户或组织的数据自动加上 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全局作用域是什么_Laravel Eloquent Global Scopes应用指南的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号