Zapytanie, które próbujesz zrobić z doktryną, jest powiązane z najlepsza-n-na-grupę . Użycie zapytania podrzędnego, a następnie połączenie z zapytaniem głównym, komplikuje sprawę z doktryną. Poniżej znajduje się przepisana wersja SQL, aby uzyskać te same wyniki bez użycia jakichkolwiek funkcji agregujących:
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
Konwertowanie powyższego zapytania na doktrynę lub DQL jest łatwe, poniżej znajduje się wersja powyższego SQL w 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
Lub za pomocą kreatora zapytań możesz napisać coś takiego, jak testowałem poniżej z symfony 2.8, używając Schemat DEMO
$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();
Innym pomysłem byłoby utworzenie widoku za pomocą zapytania w bazie danych i utworzenie encji w symfony umieść nazwę widoku w adnotacji tabeli i po prostu zacznij wywoływaćswój encję da wyniki zwrócone przez zapytanie ale to podejście nie jest zalecane tylko jako tymczasowe rozwiązanie .