doctrineで実行しようとしているクエリは、グループあたり最大のn 。サブクエリを使用してからメインクエリに参加するには、Doctrineで処理するのが複雑になります。したがって、以下は、集計関数を使用せずに同じ結果を取得するように書き直されたSQLバージョンです。
SELECT
a.*
FROM
score a
LEFT JOIN score b
ON a.name = b.name
AND a.score < b.score
WHERE b.score IS NULL
ORDER BY a.score DESC
上記のクエリをdoctrineまたはDQLと同等に変換するのは簡単です。以下は、上記のSQLのDQLバージョンです。
SELECT a
FROM AppBundle\Entity\Score a
LEFT JOIN AppBundle\Entity\Score b
WITH a.name = b.name
AND a.score < b.score
WHERE b.score IS NULL
ORDER BY a.score DESC
または、クエリビルダーを使用すると、 を使用して、symfony2.8で以下でテストしたようなものを書くことができます。デモスキーマ
$DM = $this->get( 'Doctrine' )->getManager();
$repo = $DM->getRepository( 'AppBundle\Entity\Score' );
$results = $repo->createQueryBuilder( 'a' )
->select( 'a' )
->leftJoin(
'AppBundle\Entity\Score',
'b',
'WITH',
'a.name = b.name AND a.score < b.score'
)
->where( 'b.score IS NULL' )
->orderBy( 'a.score','DESC' )
->getQuery()
->getResult();
別のアイデアは、データベースでクエリを使用してビューを作成し、symfonyでエンティティを作成してビュー名をテーブルアノテーションに配置し、エンティティの呼び出しを開始すると、クエリによって返される結果が得られますが、このアプローチは一時的な修正としてはお勧めしません。