是否可以在每次查询特定模型时应用过滤器?因此,不必每次都这样写:
User::where('exclude', false)->all();
User::where('exclude', false)->first();
User::where('exclude', false)->where(...);
...
您可以在模型本身中包含where子句?结果将使上面的查询看起来像这样:
User::all();
User::first();
User::where(...);
...
将字段exclude
设置为true的所有用户都不会出现在查询结果中。
此外,它还能在引用该模型的每个关系中工作吗?例如:
$post->user();
$group->users();
不确定如何处理此问题。首先,我尝试覆盖像这样的单个方法:
public static function all($columns = []) {
return self::where('exclude', false)->get($columns);
}
但是,它似乎没有任何作用。此外,即使这样做,也只会影响专门使用all()
方法的查询调用,而不会影响其他查询。
答案 0 :(得分:2)
您正在谈论的是全球范围:https://laravel.com/docs/5.7/eloquent#global-scopes
它看起来像这样:
class User extends Model
{
protected static function boot()
{
parent::boot();
static::addGlobalScope('exclude', function (Builder $builder) {
$builder->where('exclude', false);
});
}
}
这会影响对此模型的任何查询。您可以根据需要随时将其删除:
User::withoutGlobalScope('exclude')->get();