小编Chu*_* Ma的帖子

带有"$ fetchJoinCollection = true"的Paginator在学说DQL中不会尊重"ORDER BY"吗?

有一个奇怪的问题.我们正在使用MariaDB 5.5和doctrine/orm 2.3.3,并尝试使用带有DQL的Doctrine Paginator. 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);
   ....
Run Code Online (Sandbox Code Playgroud)

我转储了sql并手动运行它.sql也给出了正确的排序.所以有些东西导致了Doctrine的Paginator类中的排序问题.

当我设置$ fetchJoinCollection = false并将其传递给Paginator构造函数时,对于任何给定的$ pageSize,排序都是正确的!

阅读Doctrine源代码[Doctrine/ORM/Tools/Pagination/Paginator.php].使用$ fetchJoinCollection = true,doctrine使用WhereInWalker获取最终结果,该结果不遵循DQL中的ORDER By子句,因为IN()子句不会以与内部ID相同的顺序生成结果. IN()子句.

可以在按SQL IN()子句中的值顺序排序中找到IN()子句的排序解决方案.但我找不到使用它的Doctrine.

任何具有学说内在知识的人都会有所帮助吗?!谢谢!

php orm doctrine-orm

10
推荐指数
1
解决办法
1277
查看次数

标签 统计

doctrine-orm ×1

orm ×1

php ×1