Пользовательская фильтрация на модели Eloquent - PullRequest
0 голосов
/ 07 апреля 2019

Мое приложение поддерживает выборку данных с фильтрами. Моя текущая реализация (которая отлично работает) -

Model::select($fields)->with($relations)->tap(function ($query) use ($filters) {
  // A lot of filtering logic here
  // $query->where()...... 
})->get();

Однако я бы хотел перенести логику фильтрации прямо в модель, чтобы я мог просто сделать

Model::select($fields)
  ->with($relations)
  ->applyFilters($filters)
  ->get();

Я пытался добавить filter метод к Model, но в этот момент я работаю с Builder, и он не распознает мою функцию:

Вызов неопределенного метода Illuminate \ Database \ Eloquent \ Builder :: applyFilters ()

Есть ли более простой способ сделать это, кроме создания нового класса построителя и использования этого?

1 Ответ

1 голос
/ 07 апреля 2019

Я понял это! Мне просто нужно было добавить scopeApplyFilters в мой Model класс. Он автоматически вводит Builder в качестве первого параметра, поэтому логика выглядит как

public function scopeApplyFilters($query, $filters)
{
    // Perform filtering logic with $query->where(...);

    return $query;
}

Тогда я могу просто позвонить с Model::applyFilters($filters);

...