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) {
        $builder->where('status', 'active');
    });
}

注意:用字符串名注册时,取消要用同名,例如 withoutGlobalScope('active')

基本上就这些。全局作用域不复杂但容易忽略——关键在统一性和可维护性,别滥用,也别漏掉清除场景。


# laravel  # app  # 作用域  # 字符串  # 接口  # class  # 闭包  # database  # 重写  # 移除  # 这是  # 在这里  # 你要  # 用了  # 要用  # 可以直接  # 创建一个  # 也别 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: b2c电商网站制作流程,b2c水平综合的电商平台?  javascript中闭包概念与用法深入理解  如何快速生成橙子建站落地页链接?  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  Swift开发中switch语句值绑定模式  如何在云指建站中生成FTP站点?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  网站制作软件有哪些,制图软件有哪些?  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  北京的网站制作公司有哪些,哪个视频网站最好?  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  在线制作视频的网站有哪些,电脑如何制作视频短片?  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  Laravel怎么清理缓存_Laravel optimize clear命令详解  Laravel如何使用Livewire构建动态组件?(入门代码)  如何用虚拟主机快速搭建网站?详细步骤解析  如何快速搭建安全的FTP站点?  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  PHP 500报错的快速解决方法  Android利用动画实现背景逐渐变暗  油猴 教程,油猴搜脚本为什么会网页无法显示?  JavaScript如何实现继承_有哪些常用方法  高端云建站费用究竟需要多少预算?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  北京网站制作的公司有哪些,北京白云观官方网站?  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  微信小程序 scroll-view组件实现列表页实例代码  node.js报错:Cannot find module 'ejs'的解决办法  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  香港服务器部署网站为何提示未备案?  如何快速搭建高效香港服务器网站?  如何做网站制作流程,*游戏网站怎么搭建?  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  java中使用zxing批量生成二维码立牌  Thinkphp 中 distinct 的用法解析  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  企业网站制作这些问题要关注  C++用Dijkstra(迪杰斯特拉)算法求最短路径  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  如何用JavaScript实现文本编辑器_光标和选区怎么处理  如何续费美橙建站之星域名及服务?  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件