Enkin
@Enkin
менеджер инет-проектов

Yii2 как сделать пагинацию для сгруппированных строк?

Привет,
Есть таблица БД с событиями:
screen_1CB32D8A.png

Нет проблем вывести их построчно с пагинацией стандартным средством YII:
$query = Events::find()
                    ->where(['eventActive'=> 1])
                    ->orderBy('eventDate DESC');

        $count = $query->count();

        $pagination = new Pagination(['totalCount' => $count, 'forcePageParam'=> false, 'defaultPageSize'=>10]);

        $eventsData = $query->offset($pagination->offset)
            ->limit($pagination->limit)
            ->all();
        return $this->render('index', [
            'eventsData' => $eventsData,
            'pagination' => $pagination,
        ]);

Пример:
Событие А
Событие Б
Событие Б
Событие А
Событие Б

(во вьюхе просто цикл с показом блока)

Но мне нужно группировать события одного типа, идущие последовательно, а еще лучше - попадающие в интервал дат:
Событие А
2 события Б
Событие А
Событие Б
живой пример - отображение добавления фоток в ленте ВК и ФБ.

Как в этом случае реализовать выборку для конкретной страницы? Кроме как в два запроса (первый - получить все строки с оффсетом, вычесть строки которые будут сгруппированы, получить новый оффсет *; второй запрос с новым оффсетом) пока ничего не придумал, а может есть типовое решение?

* немного подумав, сообразил что получение нового оффсета - рекурсивное будет, т.к. его нужно пересчитывать снова в том случае, если на итерации попадут события, требующие группировки.
Поэтому уточняю вопрос: теперь ищу алгоритм и удобный способ хранения данных для организации facebook-like ленты с пагинацией \ lazy load для реализации на Yii2
  • Вопрос задан
  • 379 просмотров
Пригласить эксперта
Ответы на вопрос 1
EnChikiben
@EnChikiben
Я делал как вы описали в два запроса, можно конечно замутить все с joinми и потом мудрить все это дело в коде, но это того не стоит (я делал кодом, но потом другой программист долго это вкуривал))) ).
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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