应用全局作用域
要将全局作用域应用到模型,需要重写给定模型的 boot 方法并使用 addGlobalScope 方法:
<?php namespace App; use App\Scopes\AgeScope; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * 模型的“启动”方法. * * @return void */ protected static function boot() { parent::boot(); static::addGlobalScope(new AgeScope); } }
添加作用域后,如果使用 User::all() 查询则会生成如下 SQL 语句:
select * from `users` where `age` > 200
匿名的全局作用域
Eloquent 还允许我们使用闭包定义全局作用域,这在实现简单作用域的时候特别有用,这样的话,我们就没必要定义一个单独的类了:
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; class User extends Model{ /** * The "booting" method of the model. * * @return void */ protected static function boot() { parent::boot(); static::addGlobalScope('age', function(Builder $builder) { $builder->where('age', '>', 200); }); } }
移除全局作用域
如果想要在给定查询中移除指定全局作用域,可以使用 withoutGlobalScope 方法,该方法接收全局作用域的类名作为其唯一参数:
User::withoutGlobalScope(AgeScope::class)->get();
或者,如果你使用闭包定义的全局作用域的话:
User::withoutGlobalScope('age')->get();
如果你想要移除某几个或全部全局作用域,可以使用 withoutGlobalScopes 方法:
// 移除所有全局作用域 User::withoutGlobalScopes()->get(); //移除某些全局作用域 User::withoutGlobalScopes([FirstScope::class, SecondScope::class])->get();
本地作用域
本地作用域允许我们定义通用的约束集合以便在应用中复用。例如,你可能经常需要获取最受欢迎的用户,要定义这样的一个作用域,只需简单在对应 Eloquent 模型方法前加上一个 scope 前缀。
作用域总是返回查询构建器实例:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * 只包含活跃用户的查询作用域 * * @return \Illuminate\Database\Eloquent\Builder */ public function scopePopular($query) { return $query->where('votes', '>', 100); } /** * 只包含激活用户的查询作用域 * * @return \Illuminate\Database\Eloquent\Builder */ public function scopeActive($query) { return $query->where('active', 1); } }
内容版权声明:除非注明,否则皆为本站原创文章。