Den forespørgsel, du forsøger at gøre med doktrin, er relateret til største-n-pr-gruppe . For at bruge en underforespørgsel og derefter slutte sig til hovedforespørgslen, bliver tingene komplicerede at håndtere med doktrin. Så nedenfor er den omskrevne SQL-version for at få de samme resultater uden brug af samlede 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
Det er nemt at konvertere ovenstående forespørgsel svarende til doktrin eller DQL, nedenfor er DQL-versionen af ovenstå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 query builder kan du skrive noget som jeg har testet nedenfor med symfony 2.8 ved at bruge DEMO-skema
$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 anden idé ville være at oprette en visning ved hjælp af din forespørgsel i databasen, og i symfony opret en enhed, læg visningsnavnet i tabelannotering og begynd bare at kalde din enhed, det vil give resultaterne returneret af din forespørgsel, men denne tilgang anbefales ikke, bare en midlertidig rettelse .