10

有一个奇怪的问题。我们正在使用 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() 子句中的值顺序排序中找到。但我找不到使用它的教义。

任何有教义内识的人都会有所启发?!谢谢!

4

1 回答 1

1

发现人们已经处理了这个问题。

http://www.doctrine-project.org/jira/browse/DDC-2593

于 2015-01-23T08:44:38.837 回答