在Laravel中的模型的每次查询生成器调用之前应用过滤器

在Laravel中的模型的每次查询生成器调用之前应用过滤器,laravel,query-builder,Laravel,Query Builder,是否可以在每次查询特定模型时应用筛选器?所以不要每次都写这样的东西: User::where('exclude', false)->all(); User::where('exclude', false)->first(); User::where('exclude', false)->where(...); ... 您可以在模型本身中包含where子句吗?结果将使上述查询如下所示: User::all(); User::first(); User::where(...);

是否可以在每次查询特定模型时应用筛选器?所以不要每次都写这样的东西:

User::where('exclude', false)->all();
User::where('exclude', false)->first();
User::where('exclude', false)->where(...);
...
您可以在模型本身中包含where子句吗?结果将使上述查询如下所示:

User::all();
User::first();
User::where(...);
...
class User extends Model
{

  protected static function boot()
  {
    parent::boot();

    static::addGlobalScope('exclude', function (Builder $builder) {
        $builder->where('exclude', false);
    });
  }
}
使字段
exclude
设置为true的所有用户不会出现在查询结果中

此外,它是否也可以在引用模型的每个关系中工作?例如:

$post->user();
$group->users();
我不知道该怎么做。首先,我尝试重写一个方法,如下所示:

public static function all($columns = []) {
    return self::where('exclude', false)->get($columns);
}

然而,它似乎没有任何作用。此外,即使这样做,也只会影响专门使用
all()
方法的查询调用,而不会影响其他方法。

您所说的是全局范围:

它看起来是这样的:

User::all();
User::first();
User::where(...);
...
class User extends Model
{

  protected static function boot()
  {
    parent::boot();

    static::addGlobalScope('exclude', function (Builder $builder) {
        $builder->where('exclude', false);
    });
  }
}
这会影响对此模型的任何查询。如果需要,您可以动态删除它:

User::withoutGlobalScope('exclude')->get();

你说的是全球范围:

它看起来是这样的:

User::all();
User::first();
User::where(...);
...
class User extends Model
{

  protected static function boot()
  {
    parent::boot();

    static::addGlobalScope('exclude', function (Builder $builder) {
        $builder->where('exclude', false);
    });
  }
}
这会影响对此模型的任何查询。如果需要,您可以动态删除它:

User::withoutGlobalScope('exclude')->get();

明亮的供将来参考-请注意,删除全局作用域也适用于没有问题的关系:
$group->users()->without globalscope('exclude')太棒了!供将来参考-请注意,删除全局作用域也适用于没有问题的关系:
$group->users()->without globalscope('exclude')