Вы можете использовать метод when
для условного добавления предложений к вашим запросам в зависимости от значения, проходящего тест «истина»:
PostAd::query()
->when($request->get('category_id'), function ($query, $categoryId) {
$query->where('category_id', '=', $categoryId);
})
->paginate();
Закрытие, которое вы передаете в качестве второго аргумента, получит два аргумента: экземпляр построителя запросов, который вы можете изменить, и значение, которое вы передали в качестве первого параметра методу when
.
Вы также можете сделать еще один шаг вперед и переместить логику фильтрации ввыделенный класс:
class PostAdFilters
{
protected $request;
protected $builder;
public function __construct(Request $request)
{
$this->request = $request;
}
public function apply(Builder $builder)
{
$this->builder = $builder;
foreach ($this->request->query() as $key => $value) {
// Convert something like `category_id` to `filterByCategoryId`
$methodName = 'filterBy' . Str::studly($key);
if (method_exists($this, $methodName)) {
// If the method exists, call it
call_user_func([$this, $methodName], $value);
}
}
// Return the modified query builder
return $this->builder;
}
private function filterByCategoryId($value)
{
$this->builder->where('category_id', '=', $value);
}
private function filterByKilometers($value)
{
$this->builder->where('kilometers', '=', $value);
}
// And so on...
}
class PostAd extends Model
{
public function scopeFilters(Builder $query, PostAdFilters $filters)
{
return $filters->apply($query);
}
}
Затем вы можете внедрить этот класс в свой метод контроллера и применить его к своей модели:
public function search(PostAdFilters $filters)
{
return PostAd::filter($filters)->paginate();
}
Этот подход основан наhttps://laracasts.com/series/eloquent-techniques/episodes/4