Solución 1:SQL nativo de Doctrine
Una forma de lograr esto es mediante el uso de consultas MySQL nativas. Esto requiere el uso de SQL nativo de Doctrine característica y mapear los resultados de la consulta usando un Asignación de conjunto de resultados .
Encontré un problema al ejecutar una consulta Native SQL dos veces (con diferentes parámetros), que el conjunto de resultados de la segunda consulta era el mismo que el primero. Siguiente publicación en GitHub resolvió esto para mí.
Solución 2:usar el optimizador interno de MySQL
El uso de la siguiente condición de combinación utilizará el optimizador interno de MySQL y lo tratará como un ref_or_null
tipo de unión
SELECT a.*, b.*
FROM a
INNER JOIN b ON
a.column = b.column
OR (a.column IS NULL AND b.column IS NULL)
Entonces es posible usar esta condición de unión en DQL, que se traducirá muy bien en SQL para optimizarse.
Solución 3:Escribir función DQL personalizada
Escribí una función DQL personalizada que se tradujo en la siguiente cláusula:
SELECT a.*, b.*
FROM a
INNER JOIN b ON (a.column <=> b.column) = 1
Desafortunadamente, no fue posible deshacerse del = 1
parte de esta cláusula. Esto funcionó, pero causó un importante impacto en el rendimiento de mi consulta:17 s frente a 0,5 s, para dar alguna indicación (no científica).
Así que no profundicé en ese camino.