Как организовать пагинацию сложных запросов к MySQL в Laravel 6.x?

Доброго времени суток.

Изучаю Laravel. Есть задача следующего плана.

У меня есть страница с формой. Задача формы - сотавить запрос к базе данных, чтобы получить оттуда некоторый набор данных. То есть, есть 2 поля датавремя (От и До), и есть некоторое количество групп с галочками. В каждой группе должна стоять как минимум одна галочка. Как только мы нажимаем кнопку, то попадаем на другую страницу, которая выводит значения из базы данных, на основании запроса. Но строк может быть очень много, до нескольких десятков тысяч. И логисным встаёт вопрос пагинации.

Если писать не на фреймворке (конкретно этот пример), то я понимаю как это делать. Но пробую на Laravel 6.x, то тут я начинаю тупить. Данные в таблицу заносятся нормально, если нет пагинации. Если я указываю пагинацию, то соответственно выводится только первая страница с нужным количеством строк. Но при переходе на вторую страницу, или любую другую, выпадает ошибка, так как в запросе всего 1 GET-параметр 'page'.

Логика подсказывает, что надо либо кэшировать, либо куда-то сохранять сам запрос, ну а лучше всего кэшировать рультат запроса и его каким-то образом выводить с пагинацией. Но судя по документации всё должно быть проще. Либо я чего-то не вижу, либо просто не понимаю документацию. Возможно просто туплю.

Мои попытки найти ответ привели к следующему. В официальной документации очень простые примеры, из разряда вывести все статьи на страницу отсортированную по времени. Ну может ещё что-то добавлено. Но всё это не получено GET-запросом, а просто выводится переходя на какую-то определённую страницу, где просто эти данные уже есть. Великий и могучий (Google и Яндекс) тоже дают в лучшем случае ссылки на версии Laravel 5.2, 5.4, 5,8. Но и там примерно всё тоже самое. Есть отсылка к Eloquent, но тут я туплю по полной. Я понял что это работа с моделью. Но если я правильно понимаю, что это нужно чтобы настроить межтабличное взаимодействие (один к одному, один ко многим, многие ко многим). Но у меня одна таблица в которой всё находится и из неё мне нужно достать отфильтрованные данные.

Я уже 2 недели в тупике, и пока выхода не вижу. Я думаю, что с подобной задачей уже сталкивались, вряд ли я придумал что-то новое (уровень не тот). Подскажите хотя бы направление куда смотреть. Или опишите принцип. Решение постараюсь уж сам как-нибудь найти.

Ссылка на пример формы:
Пример формы

Пример запроса, который обрабатывается в модели:
Код

public function getData() {
        $request = request()->all();

        $group1 = [];
        foreach($request as $key => $value) {
            if(substr_count($key, 'gr1') > 0) {
                $group1[] = ['gr1', '=', $value];
            }
        }

        $group2 = [];
        foreach($request as $key => $value) {
            if(substr_count($key, 'gr2') > 0) {
                $group2[] = ['gr2', '=', $value];
            }
        }

        $group3 = [];
        foreach($request as $key => $value) {
            if(substr_count($key, 'gr3') > 0) {
                $group3[] = ['gr3', '=', $value];
            }
        }

        $data = DB::table('table_name')
            ->where([
                ['datetime', '>=', $request['datetimeFrom']],
                ['datetime', '<=', $request['datetimeTo']],
            ]);

        $data = $data->where(function ($query) use ($group1) {
            foreach($group1 as $item) {
                $query->orWhere($item[0], $item[1], $item[2]);
            }
        });

        $data = $data->where(function ($query) use ($group1) {
            foreach($group2 as $item) {
                $query->orWhere($item[0], $item[1], $item[2]);
            }
        });
        
        $data = $data->where(function ($query) use ($group1) {
            foreach($group2 as $item) {
                $query->orWhere($item[0], $item[1], $item[2]);
            }
        });
    }



Прошу заранее прощения за столь длинный вопрос, но всё же надеюсь на поддержку и адекватную помощь.
Надеюсь я ясно донёс свою мысль. Если нет, то готов к конструктивному общению.
  • Вопрос задан
  • 217 просмотров
Решения вопроса 1
@Kostik_1993
Fullstack Web Developer | PHP | Laravel | Vue.js
Я так понял форма отправляется через GET метод. При переходе на другую страницу параметров нет
Для этого в шаблоне там где вывод пагинации вам нужно добавить метод appends
// Было
{{ $users->links() }}

// Стало
{{ $users->appends(request()->all())->links() }}


Взято отсюда

Я уже 2 недели в тупике, и пока выхода не вижу.

Две недели это конечно многовато)) Читайте документацию тщательнее
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Sanasol
@Sanasol Куратор тега Laravel
нельзя просто так взять и загуглить ошибку
Логика подсказывает, что надо либо кэшировать, либо куда-то сохранять сам запрос, ну а лучше всего кэшировать рультат запроса и его каким-то образом выводить с пагинацией

А сделать свои ссылки-то не подсказывает логика?

Добавить к своим параметрам &page=N и всё.

Ну или уж свою пагинацию сделать полностью, а не использовать paginate никто не запрещает.
Ответ написан
Ваш ответ на вопрос

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

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