在 Laravel 的 Eloquent ORM 中,Scopes(作用域)是一种用于封装数据库查询逻辑的便捷方式。Scopes 可以帮助你在模型中定义常用的查询逻辑,并使其在需要时更易于重用和调用。
Scopes 有两种类型:全局作用域(Global Scopes)和局部作用域(Local Scopes)。
局部作用域(Local Scopes)
局部作用域是一种在模型中定义的查询方法,你可以通过调用这个方法来应用特定的查询逻辑。
定义局部作用域
你可以在模型中定义一个局部作用域方法。局部作用域方法的名称应该以 scope
开头,并且在调用时不需要包括 scope
前缀。
例如,在 User
模型中定义一个 scopeActive
局部作用域:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
// 定义一个局部作用域来筛选激活的用户
public function scopeActive($query)
{
return $query->where('active', 1);
}
}
使用局部作用域
使用局部作用域时,只需在查询中调用不带 scope
前缀的方法:
use App\Models\User;
// 获取所有激活的用户
$activeUsers = User::active()->get();
你还可以将多个作用域链式调用:
// 定义另一个作用域来筛选管理员用户
public function scopeAdmin($query)
{
return $query->where('role', 'admin');
}
// 获取所有激活的管理员用户
$activeAdmins = User::active()->admin()->get();
全局作用域(Global Scopes)
全局作用域是你希望在模型的所有查询中自动应用的查询逻辑。定义全局作用域时,你需要创建一个实现 Scope
接口的类,并在模型中注册该作用域。
定义全局作用域
创建一个全局作用域类:
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('active', 1);
}
}
注册全局作用域
在模型中注册全局作用域:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use App\Scopes\ActiveScope;
class User extends Model
{
protected static function booted()
{
static::addGlobalScope(new ActiveScope);
}
}
使用全局作用域
全局作用域会自动应用于所有的查询:
use App\Models\User;
// 获取所有激活的用户
$users = User::all(); // 仅返回激活的用户
如果你想在特定查询中忽略全局作用域,可以使用 withoutGlobalScope
方法:
use App\Models\User;
use App\Scopes\ActiveScope;
// 获取所有用户,包括未激活的用户
$allUsers = User::withoutGlobalScope(ActiveScope::class)->get();
总结
- 局部作用域:在模型中定义以
scope
开头的方法,用于封装特定的查询逻辑,调用时省略scope
前缀。 - 全局作用域:创建一个实现
Scope
接口的类,并在模型中注册该作用域,自动应用于所有查询。
使用作用域可以使你的查询逻辑更加清晰、可重用,并且更易于维护。
标签:Laravel,Scopes,use,作用域,App,Eloquent,User,全局 From: https://www.cnblogs.com/laraveler/p/18193307