De vraag die u probeert te doen met doctrine is gerelateerd aan grootste-n-per-groep . Om een subquery te gebruiken en vervolgens samen te voegen met de hoofdquery, moet u ingewikkelde zaken oplossen met doctrine. Dus hieronder is de herschreven SQL-versie om dezelfde resultaten te krijgen zonder gebruik van statistische functies:
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
Het is eenvoudig om bovenstaande query te converteren naar doctrine of DQL, hieronder vindt u de DQL-versie van bovenstaande 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
Of met de querybuilder kun je iets schrijven zoals ik hieronder heb getest met symfony 2.8 met behulp van de 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();
Een ander idee zou zijn om een weergave te maken met behulp van uw query in de database en in symfony een entiteit te maken, de weergavenaam in de tabelannotatie te plaatsen en gewoon uw entiteit te bellen, het geeft de resultaten die door uw query worden geretourneerd, maar deze aanpak wordt niet aanbevolen, slechts een tijdelijke oplossing .