10

奇妙な問題があります。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);
   ....

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() 句。

IN() 句のソート ソリューションは、 SQL IN() 句の値の順序による並べ替え にあります。しかし、それを使用しているDoctrineが見つかりません。

Doctrineの内部知識を持っている人なら誰でも光を当てるでしょうか?! ありがとう!

4

1 に答える 1

1

人々はすでにこの問題に対処していることがわかりました。

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

于 2015-01-23T08:44:38.837 に答える