Lösning 1:Doctrine Native SQL
Ett sätt att uppnå detta är att använda inbyggda MySQL-frågor. Detta kräver användning av Doktrinens ursprungliga SQL funktion och kartläggning av resultaten av frågan med en ResultSetMapping .
Jag stötte på ett problem när jag körde en Native SQL-fråga två gånger (med olika parametrar), att den andra frågans resultatuppsättning var densamma som den första.Följande inlägg på GitHub löste detta åt mig.
Lösning 2 :Använder MySQL:s interna optimizer
Om du använder följande anslutningsvillkor kommer att använda MySQL:s interna optimerare och behandla detta som en ref_or_null
join-typ
SELECT a.*, b.*
FROM a
INNER JOIN b ON
a.column = b.column
OR (a.column IS NULL AND b.column IS NULL)
Det är sedan möjligt att använda detta join-villkor i DQL, som kommer att översättas snyggt till SQL för att optimeras.
Lösning 3:Skriv anpassad DQL-funktion
Jag skrev en anpassad DQL-funktion som översattes i följande klausul:
SELECT a.*, b.*
FROM a
INNER JOIN b ON (a.column <=> b.column) = 1
Tyvärr kunde den inte bli av med = 1
del av denna klausul. Detta fungerade, men orsakade en stor prestandapåverkan på min fråga:17s vs 0,5s, för att ge någon (icke-vetenskaplig) indikation.
Så jag gick inte längre på den vägen.