有一个奇怪的问题。我们正在使用 MariaDB 5.5 和doctrine/orm 2.3.3,并尝试将 Doctrine Paginator 与 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 来获取最终结果,这不遵守DQL 中的ORDER By 子句,因为IN() 子句不会按照与DQL 中的id 相同的顺序生成结果。 IN() 子句。
IN() 子句的排序解决方案可以在按 SQL IN() 子句中的值顺序排序中找到。但我找不到使用它的教义。
任何有教义内识的人都会透露一些信息吗?!谢谢!
发现人们已经解决了这个问题。