Примените фильтр перед каждым вызовом построителя запросов для модели в Laravel - PullRequest
0 голосов
/ 21 января 2019

Можно ли применять фильтр каждый раз, когда вы хотите запросить конкретную модель? Поэтому вместо того, чтобы писать что-то подобное каждый раз:

User::where('exclude', false)->all();
User::where('exclude', false)->first();
User::where('exclude', false)->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 голосов
/ 21 января 2019

Вы говорите о глобальной области действия: 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();
...