Die Abfrage, die Sie mit Lehre zu machen versuchen, bezieht sich auf größte-n-pro-Gruppe . Wenn Sie eine Unterabfrage verwenden und sich dann mit der Hauptabfrage verbinden, wird die Handhabung der Doktrin kompliziert. Unten ist also die umgeschriebene SQL-Version, um die gleichen Ergebnisse ohne Verwendung von Aggregatfunktionen zu erhalten:
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
Die obige Abfrage äquivalent zu Doktrin oder DQL zu konvertieren ist einfach, unten ist die DQL-Version von obigem 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
Oder mit dem Query Builder können Sie etwas schreiben, wie ich es unten mit Symfony 2.8 getestet habe, indem Sie verwenden 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();
Eine andere Idee wäre, eine Ansicht mit Ihrer Abfrage in der Datenbank zu erstellen und in Symfony eine Entität zu erstellen, den Ansichtsnamen in die Tabellenanmerkung einzufügen und einfach mit dem Aufrufen Ihrer Entität zu beginnen, es wird die von Ihrer Abfrage zurückgegebenen Ergebnisse liefern, aber dieser Ansatz wird nicht nur als vorübergehende Lösung empfohlen .