Solution 1 :Doctrine SQL natif
Une façon d'y parvenir est d'utiliser des requêtes MySQL natives. Cela nécessite l'utilisation de SQL natif de Doctrine fonctionnalité et cartographier les résultats de la requête à l'aide d'un ResultSetMapping .
J'ai rencontré un problème lors de l'exécution d'une requête SQL native deux fois (avec des paramètres différents), à savoir que le jeu de résultats de la deuxième requête était le même que le premier.Poste suivant sur GitHub résolu cela pour moi.
Solution 2 :Utiliser l'optimiseur interne de MySQL
L'utilisation de la condition de jointure suivante utilisera l'optimiseur interne de MySQL et la traitera comme un ref_or_null
type de jointure
SELECT a.*, b.*
FROM a
INNER JOIN b ON
a.column = b.column
OR (a.column IS NULL AND b.column IS NULL)
Il est alors possible d'utiliser cette condition de jointure en DQL, qui sera joliment traduite en SQL pour être optimisée.
Solution 3 :Écrire une fonction DQL personnalisée
J'ai écrit une fonction DQL personnalisée qui s'est traduite dans la clause suivante :
SELECT a.*, b.*
FROM a
INNER JOIN b ON (a.column <=> b.column) = 1
Malheureusement, il n'a pas été en mesure de se débarrasser du = 1
partie de cette clause. Cela a fonctionné, mais a causé un majeur impact sur les performances de ma requête :17 s contre 0,5 s, pour donner une indication (non scientifique).
Je ne suis donc pas allé plus loin dans cette voie.