Возникает странная проблема. Мы используем MariaDB 5.5 и doctrine/orm 2.3.3 и пытаемся использовать Paginator Doctrine с DQL. http://docs.doctrine-project.org/en/latest/tutorials/pagination.html
В DQL есть предложение ORDER BY [см. ниже пример иллюстрации]. Однако результат не сортируется вообще для заданного размера страницы. И, если мы увеличим размер страницы для охвата всего набора результатов, сортировка станет правильной.
$dql = "SELECT a, b FROM EntityA a JOIN a.propertyB b ORDER BY a.createdOn DESC";
$query = $this->em->createQuery($dql)
->setMaxResults($pageSize)
->setFirstResult($offset);
$paginator = new Paginator($query, $fetchJoinCollection=true);
....
Я сбросил sql и вручную запускал его. Sql также дал правильную сортировку. Таким образом, что-то вызывает проблему сортировки в классе Doctrine Paginator.
Когда я устанавливаю $fetchJoinCollection = false и передал его в конструктор Paginator, сортировка стала правильной для любого заданного $pageSize!
Прочитайте исходный код Doctrine [Doctrine/ORM/Tools/Pagination/Paginator.php]. С $fetchJoinCollection = true доктрина использует WhereInWalker для получения конечного результата, который не учитывает предложение ORDER BY в DQL, поскольку предложение IN() не генерирует результат в том же порядке, что и идентификаторы внутри IN().
Решение сортировки для предложения IN() можно найти в Заказ по порядку значений в предложении SQL IN(). Но я не могу найти Doctrine, используя это.
Кто-нибудь с внутренним знанием Доктрины прольет какой-то свет?! Спасибо!