https://www.doctrine-project.org/projects/doctrine-orm/en/3.7/tutorials/pagination.html Неужели, дождался оффсетной и курсорной пагинации в нормальном исполнении.

В Doctrine ORM (начиная с версии 3.7) доступны два встроенных стратегических подхода к пагинации: OffsetPaginator (на базе смещения) и CursorPaginator (на базе курсора). Оба инструмента автоматизируют генерацию сложных SQL-запросов, но решают разные задачи.

php use DoctrineORMToolsPaginationOffsetPaginator; use DoctrineORMToolsPaginationWindow; $dql = 'SELECT p, c FROM BlogPost p JOIN p.comments c ORDER BY p.id ASC'; $query = $entityManager-createQuery($dql); // new Window($firstResult, $maxResults), or Window::fromPageNumberAndSize($pageNumber, $pageSize) $page = (new OffsetPaginator())->paginate($query, Window::fromPageNumberAndSize(1, 25)); echo $page->getTotalCount() . " result(s), page {$page->getPageNumber()} of {$page->getPageCount()}n"; foreach ($page as $post) { echo $post->getHeadline() . "n"; } if ($page->hasNextPage()) { $nextWindow = $page->getNextWindow(); // Window for the next page }

php use DoctrineORMToolsPaginationCursorPaginator; $dql = 'SELECT p FROM BlogPost p ORDER BY p.createdAt DESC, p.id DESC'; $query = $entityManager-createQuery($dql); $paginator = new CursorPaginator(limit: 15); $page = $paginator->paginate($query, $cursor); foreach ($page as $post) { echo $post->getTitle() . "n"; } echo $page->getPreviousCursorAsString(); // previous encoded cursor string echo $page->getNextCursorAsString(); // next encoded cursor string

https://www.doctrine-project.org/projects/doctrine-orm/en/3.7/tutorials/pagination.html
Неужели, дождался оффсетной и курсорной пагинации в нормальном исполнении.
В Doctrine ORM (начиная с версии 3 | Сетка — социальная сеть от hh.ru