有一个奇怪的问题.我们使用的是MariaDB 5.5和doctrine / orm 2.3.3,并尝试使用DQL的Doctrine Paginator.
http://docs.doctrine-project.org/en/latest/tutorials/pagination.html
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()子句不会按照与IN()子句.
IN()子句的排序解决方案可以在Ordering by the order of values in a SQL IN() clause找到.但是我找不到使用这个的Doctrine.
任何有教义内在知识的人都会有点光明吗?谢谢!
发现人们已经照顾这个问题了.