Řešení 1:Doctrine Native SQL
Jedním ze způsobů, jak toho dosáhnout, je použití nativních dotazů MySQL. To vyžaduje použití Nativní SQL doktríny funkce a mapování výsledků dotazu pomocí ResultSetMapping .
Při provádění nativního SQL dotazu dvakrát (s různými parametry) jsem narazil na problém, že sada výsledků druhého dotazu byla stejná jako první.Sledování příspěvku na GitHubu vyřešil to za mě.
Řešení 2:Použití interního optimalizátoru MySQL
Použití následující podmínky spojení použije interní optimalizátor MySQL a bude to považovat za ref_or_null
typ spojení
SELECT a.*, b.*
FROM a
INNER JOIN b ON
a.column = b.column
OR (a.column IS NULL AND b.column IS NULL)
Pak je možné použít tuto podmínku spojení v DQL, která bude pěkně přeložena do SQL, aby byla optimalizována.
Řešení 3:Napište vlastní funkci DQL
Napsal jsem vlastní funkci DQL, která přeložila následující klauzuli:
SELECT a.*, b.*
FROM a
INNER JOIN b ON (a.column <=> b.column) = 1
Bohužel se nepodařilo zbavit = 1
součástí tohoto ustanovení. To fungovalo, ale způsobilo to závažné dopad na výkon na můj dotaz:17 s vs 0,5 s, abych uvedl nějaký (nevědecký) údaj.
Takže jsem touto cestou nešel dále.