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 :
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 !!!
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();
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 :
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.
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
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.
Partager