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
  • Вопрос задан
  • 385 просмотров
Пригласить эксперта
Ответы на вопрос 1
EnChikiben
@EnChikiben
Я делал как вы описали в два запроса, можно конечно замутить все с joinми и потом мудрить все это дело в коде, но это того не стоит (я делал кодом, но потом другой программист долго это вкуривал))) ).
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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