带有“$fetchJoinCollection = true”的分页器不会遵守 DQL 中的“ORDER BY”?

问题描述 投票:0回答:1

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

任何有教义内识的人都会透露一些信息吗?!谢谢!

php orm doctrine-orm
1个回答
1
投票

发现人们已经解决了这个问题。

https://github.com/doctrine/orm/issues/3323

© www.soinside.com 2019 - 2024. All rights reserved.