奇妙な問題があります。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の内部知識を持っている人なら誰でも光を当てるでしょうか?! ありがとう!