Frågan du försöker göra med doktrin är relaterad till bästa-n-per-grupp . Att använda en underfråga och sedan gå med i huvudfrågan blir det komplicerat att hantera med doktrin. Så nedan är den omskrivna SQL-versionen för att få samma resultat utan användning av några aggregerade funktioner:
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
Att konvertera ovanstående fråga som motsvarar doktrin eller DQL är enkelt, nedan är DQL-versionen av ovanstående 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
Eller med frågebyggaren kan du skriva något som jag har testat nedan med symfony 2.8 med DEMO Schema
$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();
En annan idé skulle vara att skapa en vy med hjälp av din fråga i databasen och i symfony skapa en entitet, lägg vynnamnet i tabellkommentaren och börja bara ringa din entitet, det kommer att ge resultaten som returneras av din fråga, men detta tillvägagångssätt rekommenderas inte bara en tillfällig fix .