Bonjour,

je me casse les dents face à un problème incompréhensible de requête.

Ma table A possède deux champs m1 et m2 ne même nature qui pointent donc vers la même seconde table B. Je veux récupérer A avec les entités de B associées et fais donc un classique :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
$ratios = Doctrine_Core::getTable('A')
            ->createQuery('a')
            ->leftJoin('a.m1 m1')
            ->leftJoin('a.m2 m2')
            ->where('i.id=1')
	    ->execute();
et symfony me génère ... 7 requêtes ! Celle que je demande et 2x3 autres sur la table B, un pour m1 et les deux autres identiques pour m2, cela deux fois !!!

Sur toutes les autres tables les jointures fonctionnent parfaitement et en faite les autres jointures de cette table de type one comme celles qui me posent problème fonctionnent parfaitement.

Tout se passe comme si la double référence dans la requête à une même table, bien qu'avec un alias différent, empêche doctrine ou symfony de faire la requête correcte ou d'hydrater le résultat correctement. Côté schema.yml la seule différence entre la définition de ces trois champs est l'ajout à m2 de sa classe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
...
relations:
   m1:
      local: m1
      foreign: id
      type: one
    m2:
      class: B
      local: m2
      foreign: id
      type: one
    autreRelation1_N:
      local: autreRelation1_N
      foreign: id
      type: one
J'oubliais : la requête sql indiquée par la barre de débug est celle attendue et me retourne dans phpmyadmin le résultat attendu.

Même problème si je ne cherche à lier qu'une des relations.


Mieux, ces requêtes sont faites en pure perte !
Si j'affiche les relations dans l'ordre :
  • A.autreRelation1_N
  • a.m1


sans avoir join la table de autreRelation1_N symfony fait les requêtes :
  • la jointure indiquée plus haut
  • deux (au quatre si c'est le champ m2) requêtes sur la table B
  • la requête pour obtenir l'entité liée à autreRelation1_N
  • de nouveau une requête sur B pour obtenir l'entité liée à m1 , preuve que les deux précédentes sont totalement inutiles !


Pourquoi ? Comment éradiquer ce comportement et obtenir le résultat attendu par la requête SQL et récupérer au moins une trentaine de secondes d'exécution perdue ?

Merci.