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

Laravel 的模型查询作用域(Scope)是一种封装常用查询条件的方式,能让你更优雅地复用数据库查询逻辑。通过定义局部或全局作用域,可以简化 Eloquent 查询,让代码更清晰、更易维护。
局部作用域是你在模型中自定义的方法,用于封装特定的查询条件。方法名前必须加上 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();
全局作用域会自动应用到模型的所有查询中,适合用于软删除、多租户隔离等场景。
定义全局作用域:
// 创建一个全局作用域类
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中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号