有一个奇怪的问题。我们正在使用 MariaDB 5.5 和教义/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() 子句不会按照与内部 id 相同的顺序生成结果IN() 子句。
IN() 子句的排序解决方案可以在按 SQL IN() 子句中的值顺序排序中找到。但我找不到使用它的教义。
任何有教义内识的人都会有所启发?!谢谢!