La consulta que está tratando de hacer con la doctrina está relacionada con mayores-n-por-grupo . Usar una consulta secundaria y luego unirla con la consulta principal hace que las cosas sean complicadas de manejar con la doctrina. A continuación se muestra la versión de SQL reescrita para obtener los mismos resultados sin el uso de ninguna función agregada:
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
Convertir la consulta anterior equivalente a la doctrina o DQL es fácil, a continuación se muestra la versión DQL del SQL anterior:
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
O con el generador de consultas, puede escribir algo como lo probé a continuación con Symfony 2.8 usando Esquema 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();
Otra idea sería crear una vista usando su consulta en la base de datos y en Symfony crear una entidad, poner el nombre de la vista en la anotación de la tabla y simplemente comenzar a llamar a su entidad, le dará los resultados devueltos por su consulta, pero este enfoque no se recomienda solo como una solución temporal. .