@kostya1704

Как в ларавел сделать пагинацию для запроса с параметрами?

Есть запрос:
$poisks = DB::table('items')
 ->where('brand',$brand)
 ->where('location',$location)
 ->whereIn('fuel_type',[$fuel_type])
 ->whereBetween('price', [$price_from, $price_to])
 ->whereIn('body_type', [$body_type])
 ->whereIn('fuel_type', [$fuel_type])
 ->whereIn('model', [$model])
 ->paginate(10);

Запрос выдаёт результат первой страницы, есть блок пагинации , при переходе на следующую ну или любую иную страницу пагинации выдаёт - "Undefined index: brand" и тд. по всему $_POST.
Но в инструкции по ларавел - "На данный момент операции страничного вывода, которые используют оператор groupBy, не могут эффективно выполняться в Laravel. Если вам необходимо использовать groupBy для постраничного набора результатов, рекомендуется делать запрос в БД и создавать экземпляр страничного вывода вручную.
Это можно сделать создав либо экземпляр Illuminate\Pagination\Paginator, либо экземпляр Illuminate\Pagination\LengthAwarePaginator, в зависимости от ситуации.
"
Довольно скудная инфа.
Так значит нет в ларавел встроенной пагинации ?
  • Вопрос задан
  • 99 просмотров
Решения вопроса 1
@Mellorn
В чём задача? Чтобы ссылки пагинации содержали параметры запроса, по которым вы фильтруете результаты выборки?

Тогда при чём тут $_POST?
Вы же потом при клике на ссылку get-запрос делаете. Очевидно, что в данном случае $_POST у вас пустой.

В общем, для сохранения параметров из реквеста используйте метод withQueryString пагинатора.
$results = DB::table('table_name')
...
->paginate(10)
->withQueryString();

Но, как уже написал, это работает, если параметры приходят в строке запроса.

Если вам принципиально, чтобы первый запрос приходил через POST и параметры содержались именно в теле запроса, можете добавлять их в пагинатор через условие.

$results = DB::table('table_name')
...
->paginate(10);

if (request()->isMethod('POST')) {
    $results->appends(request()->post());
} else {
    $results->withQueryString();
}

Но не представляю зачем такое может понадобиться, если потом по ссылкам вы всё равно getОм ходить будете.

П.С. и не используйте глобальные массивы напрямую.
В Laravel для этого есть специальные методы:
query - из строки запроса, post - из тела post-запроса, input - из первого и второго.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Если я вас понял, можете просто вызвать методappends($request->query()) на коллекции.

Например, в вашем случае:

$poisks = DB::table('items')
 ->where('brand',$brand)
 ->where('location',$location)
 ->whereIn('fuel_type',[$fuel_type])
 ->whereBetween('price', [$price_from, $price_to])
 ->whereIn('body_type', [$body_type])
 ->whereIn('fuel_type', [$fuel_type])
 ->whereIn('model', [$model])
 ->paginate(10)
->appends($request->query());


Саму пагинацию в blade-шаблоне выводите так:
{{ $poisks->links() }}
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы