有一个奇怪的问题.我们正在使用MariaDB 5.5和doctrine/orm 2.3.3,并尝试使用带有DQL的Doctrine Paginator. 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,doctrine使用WhereInWalker获取最终结果,该结果不遵循DQL中的ORDER By子句,因为IN()子句不会以与内部ID相同的顺序生成结果. IN()子句.
可以在按SQL IN()子句中的值顺序排序中找到IN()子句的排序解决方案.但我找不到使用它的Doctrine.
任何具有学说内在知识的人都会有所帮助吗?!谢谢!