首页 > php框架 > Laravel > 正文

Laravel SCOPE作用域怎么用_Laravel模型查询作用域定义

尼克
发布: 2025-11-30 08:01:34
原创
187人浏览过
Laravel模型查询作用域用于封装复用查询逻辑,提升代码可读性。1. 局部作用域以scope前缀定义,调用时省略前缀,如active()和city()方法;2. 可通过callScope或when方法实现动态调用;3. 全局作用域自动应用于所有查询,适用于软删除、多租户等场景;4. 使用addGlobalScope添加全局作用域,支持类或闭包形式;5. 可通过withoutGlobalScope临时移除全局作用域。

laravel scope作用域怎么用_laravel模型查询作用域定义

Laravel 的模型查询作用域(Scope)是一种封装常用查询条件的方式,能让你更优雅地复用数据库查询逻辑。通过定义局部或全局作用域,可以简化 Eloquent 查询,让代码更清晰、更易维护。

局部作用域(Local Scopes)

局部作用域是你在模型中自定义的方法,用于封装特定的查询条件。方法名前必须加上 scope 前缀,调用时则省略该前缀。

定义局部作用域:

// app/Models/User.php
class User extends Model
{
    // 查询所有启用状态的用户
    public function scopeActive($query)
    {
        return $query->where('status', 1);
    }

    // 查询某个城市的用户
    public function scopeCity($query, $city)
    {
        return $query->where('city', $city);
    }
}
登录后复制

使用方式:

// 获取所有 status = 1 的用户
$activeUsers = User::active()->get();

// 获取某城市且启用的用户
$users = User::city('Beijing')->active()->get();
登录后复制

动态调用作用域

如果你希望在运行时动态决定调用哪些作用域,可以使用 callScope 方法。

$scopes = ['active', 'city'];

User::when(in_array('active', $scopes), function ($q) {
    return $q->active();
})->when(in_array('city', $scopes), function ($q) {
    return $q->city('Shanghai');
})->get();
登录后复制

全局作用域(Global Scopes)

全局作用域会自动应用到模型的所有查询中,适合用于软删除、多租户隔离等场景。

定义全局作用域:

360 AI助手
360 AI助手

360公司推出的AI聊天机器人聚合平台,集合了国内15家顶尖的AI大模型。

360 AI助手 140
查看详情 360 AI助手
// 创建一个全局作用域类
namespace App\Scopes;

use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class ActiveScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder->where('status', 1);
    }
}
登录后复制

在模型中添加全局作用域:

// app/Models/User.php
protected static function booted()
{
    static::addGlobalScope(new ActiveScope);
}
登录后复制

这样,每次查询 User 模型时都会自动加上 status = 1 的条件。

如果需要临时移除全局作用域,可使用:

// 忽略全局作用域
$allUsers = User::withoutGlobalScope(ActiveScope::class)->get();
登录后复制

匿名全局作用域

对于简单的全局条件,可以直接在模型中使用闭包定义:

protected static function booted()
{
    static::addGlobalScope('active', function (Builder $builder) {
        $builder->where('status', 1);
    });
}
登录后复制

同样可用 withoutGlobalScope('active') 来移除。

基本上就这些。作用域的核心价值是把重复的查询逻辑收拢到模型内部,避免控制器或服务层堆砌 where 条件,提升代码可读性和维护性。不复杂但容易忽略。

以上就是Laravel SCOPE作用域怎么用_Laravel模型查询作用域定义的详细内容,更多请关注php中文网其它相关文章!

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

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

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

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