Заявката, която се опитвате да направите с доктрината, е свързана с най-голям-n-на-група . За да използвате подзаявка и след това да се присъедините към основната заявка, усложнете нещата с доктрината. Така че по-долу е пренаписаната версия на 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
За да конвертирате по-горе заявка, еквивалентна на доктрина или DQL, е лесно, по-долу е DQL версията на горния SQL:
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
Или с конструктора на заявки можете да напишете нещо като тествах по-долу със symfony 2.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 създайте обект, поставете името на изгледа в анотацията на таблицата и просто започнете да извиквате обекта си, той ще даде резултатите, върнати от вашата заявка, но този подход не се препоръчва само за временна корекция .