Kueri yang Anda coba lakukan dengan doktrin terkait dengan n-per-grup terbesar . Untuk menggunakan sub kueri dan kemudian bergabung dengan kueri utama, dapatkan hal-hal rumit untuk ditangani dengan doktrin. Jadi di bawah ini adalah versi SQL yang ditulis ulang untuk mendapatkan hasil yang sama tanpa menggunakan fungsi agregat apa pun:
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
Untuk mengonversi kueri di atas yang setara dengan doktrin atau DQL itu mudah, di bawah ini adalah versi DQL dari SQL di atas:
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
Atau dengan pembuat kueri, Anda dapat menulis sesuatu seperti yang telah saya uji di bawah ini dengan symfony 2.8 menggunakan Skema 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();
Ide lain adalah membuat tampilan menggunakan kueri Anda di database dan di symfony membuat entitas, masukkan nama tampilan dalam anotasi tabel dan mulailah memanggil entitas Anda, itu akan memberikan hasil yang dikembalikan oleh kueri Anda, tetapi pendekatan ini tidak disarankan hanya perbaikan sementara .