在每个查询构建器调用Laravel中的模型之前应用过滤器

时间:2019-01-21 20:03:06

标签: 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(...);
...

将字段exclude设置为true的所有用户都不会出现在查询结果中。

此外,它还能在引用该模型的每个关系中工作吗?例如:

$post->user();
$group->users();

不确定如何处理此问题。首先,我尝试覆盖像这样的单个方法:

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

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

1 个答案:

答案 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();