Lösung 1:Doctrine Native SQL
Eine Möglichkeit, dies zu erreichen, ist die Verwendung nativer MySQL-Abfragen. Dies erfordert die Verwendung von Natives SQL von Doctrine -Funktion und Zuordnen der Ergebnisse der Abfrage mithilfe eines Ergebnissatzzuordnung .
Ich bin auf ein Problem gestoßen, als ich eine Native SQL-Abfrage zweimal (mit unterschiedlichen Parametern) ausgeführt habe, dass die Ergebnismenge der zweiten Abfrage dieselbe war wie die der ersten.Folgender Beitrag auf GitHub hat das für mich gelöst.
Lösung 2:Verwenden des internen Optimierers von MySQL
Die Verwendung der folgenden Join-Bedingung verwendet den internen Optimierer von MySQL und behandelt dies als 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)
Es ist dann möglich, diese Join-Bedingung in DQL zu verwenden, die zur Optimierung gut in SQL übersetzt wird.
Lösung 3:Benutzerdefinierte DQL-Funktion schreiben
Ich habe eine benutzerdefinierte DQL-Funktion geschrieben, die in die folgende Klausel übersetzt wurde:
SELECT a.*, b.*
FROM a
INNER JOIN b ON (a.column <=> b.column) = 1
Leider war es nicht möglich, das = 1
loszuwerden Teil dieser Klausel. Dies funktionierte, verursachte aber einen Major Auswirkungen auf die Leistung bei meiner Abfrage:17 Sekunden gegenüber 0,5 Sekunden, um einen (nicht wissenschaftlichen) Hinweis zu geben.
Also bin ich diesen Weg nicht weiter gegangen.