信息发布→ 登录 注册 退出

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

发布时间:2025-11-30

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

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)

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

定义全局作用域:

// 创建一个全局作用域类
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 条件,提升代码可读性和维护性。不复杂但容易忽略。

标签:# 移除  # 自定义  # 可以直接  # 能让  # 适用于  # 你在  # 是一种  # 如果你  # 复用  # 可通过  # php  # 数据库  # 闭包  #   # 封装  # 代码可读性  # 作用域  # ai  # app  # laravel  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!