Rozwiązanie 1:Doctrine Native SQL
Jednym ze sposobów osiągnięcia tego jest użycie natywnych zapytań MySQL. Wymaga to użycia Natywny SQL doktryny funkcja i mapowanie wyników zapytania przy użyciu Mapowanie zestawu wyników .
Podczas dwukrotnego wykonywania natywnego zapytania SQL (z różnymi parametrami) napotkałem problem polegający na tym, że zestaw wyników drugiego zapytania był taki sam jak pierwszy.Obserwowany wpis w serwisie GitHub rozwiązał to dla mnie.
Rozwiązanie 2:Użycie wewnętrznego optymalizatora MySQL
Użycie następującego warunku przyłączenia spowoduje użycie wewnętrznego optymalizatora MySQL i potraktowanie go jako ref_or_null
typ łączenia
SELECT a.*, b.*
FROM a
INNER JOIN b ON
a.column = b.column
OR (a.column IS NULL AND b.column IS NULL)
Możliwe jest wtedy użycie tego warunku złączenia w DQL, który będzie ładnie przetłumaczony w SQL w celu optymalizacji.
Rozwiązanie 3:Napisz niestandardową funkcję DQL
Napisałem niestandardową funkcję DQL, która została przetłumaczona w następującej klauzuli:
SELECT a.*, b.*
FROM a
INNER JOIN b ON (a.column <=> b.column) = 1
Niestety nie udało się pozbyć = 1
częścią tej klauzuli. To zadziałało, ale spowodowało poważne wpływ wydajności na moje zapytanie:17s vs 0,5s, aby dać pewne (nienaukowe) wskazanie.
Więc nie poszedłem dalej tą drogą.