首页 > 解决方案 > 在每个查询构建器调用 Laravel 中的模型之前应用过滤器

问题描述

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

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()方法的查询调用,而不会影响其他查询调用。

标签: laravelquery-builder

解决方案


您说的是全局范围: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();

推荐阅读