Задать вопрос
@SpinPr

Как на Laravel реализовать сложный фильтр по выборку товаров из БД?

Пока делаю так:

Считаем количество товаров удовлетворяющих фильтру:
$kol = \App\Good::select('id', 'name')->where(function ($query) {
if (...) {
$query->where('id','>',0);
}
...
много условий
...
})->count();

Получаем страницу товаров по фильтру:
$sel = \App\Good::select('id', 'name')->where(function ($query) {
if (...) {
$query->where('id','>',0);
}
...
много условий
...
})->skip(($pg-1)*$max)->take($max)->get();

Можно ли условие для фильтра составить 1 раз и потом подставить в выборку?
Как это реализовать?
  • Вопрос задан
  • 4342 просмотра
Подписаться 1 Простой 1 комментарий
Решения вопроса 2
JimmDiGreez
@JimmDiGreez
Full-stack Developer
Например можно вынести функцию в переменную.
$filter = function(query) {
    // ...
};

Good::select('id', 'name')->where($filter)->count();
Ответ написан
Комментировать
seoperin
@seoperin
Full stack web developer. Laravel / Vue
Вот например - https://www.youtube.com/watch?v=gvXsjRw0jnA
В другом видео на канале есть продолжение
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Используйте scope:
public function scopeFilter($query) 
{
    if (...) {
        $query->where('id','>',0);
    }
    ...
    много условий
    ...
    })->skip(($pg-1)*$max)->take($max)
    return $query;
}

https://laravel.com/docs/5.6/eloquent#local-scopes
Ответ написан
Комментировать
@Result007
P|-|P
Можно сделать так
$good_query = Good::query();

if (...) {
    $good_query->where('id', '>', 0);
}

$result = $good_query->skip(($pg-1)*$max)->take($max)->get();
Ответ написан
Комментировать
@vism
$kolQuery = \App\Good::select('id', 'name')->where(function ($query) {
if (...) {
$query->where('id','>',0);
}
...
много условий
...
});
$kol = $kolQuery->count();

$sel = $kolQuery->skip(($pg-1)*$max)->take($max)->get();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы