Oplossing 1:Doctrine Native SQL
Een manier om dit te bereiken is door native MySQL-query's te gebruiken. Hiervoor is het gebruik van Native SQL van de leer functie en het in kaart brengen van de resultaten van de zoekopdracht met behulp van een ResultSetMapping .
Ik kwam een probleem tegen bij het tweemaal uitvoeren van een Native SQL-query (met verschillende parameters), dat de resultatenset van de tweede query hetzelfde was als de eerste.Volgend bericht op GitHub heeft dit voor mij opgelost.
Oplossing 2:gebruik van de interne optimizer van MySQL
Als u de volgende join-voorwaarde gebruikt, wordt de interne optimizer van MySQL gebruikt en wordt deze behandeld als een ref_or_null
join-type
SELECT a.*, b.*
FROM a
INNER JOIN b ON
a.column = b.column
OR (a.column IS NULL AND b.column IS NULL)
Het is dan mogelijk om deze join-voorwaarde in DQL te gebruiken, die mooi vertaald zal worden in SQL om te optimaliseren.
Oplossing 3:schrijf een aangepaste DQL-functie
Ik heb een aangepaste DQL-functie geschreven die vertaald werd in de volgende clausule:
SELECT a.*, b.*
FROM a
INNER JOIN b ON (a.column <=> b.column) = 1
Helaas is het niet gelukt om de = 1
. te verwijderen onderdeel van deze clausule. Dit werkte, maar veroorzaakte een grote prestatie-impact op mijn vraag:17s versus 0,5s, om een (niet-wetenschappelijke) indicatie te geven.
Dus ik ging niet verder op die weg.