IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

[Doctrine 1] Jointure de deux champs sur la même table qui ne se fait pas


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 71
    Points : 60
    Points
    60
    Par défaut [Doctrine 1] Jointure de deux champs sur la même table qui ne se fait pas
    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.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Je n'utilise pas doctrine, mais es tu sur que les requetes supplémentaires sont bien générés par ta requete originale? je veux dire a quel moment sont faites les requetes parasites?

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 71
    Points : 60
    Points
    60
    Par défaut Symfony n'en fait qu'à sa tête ?
    @gototog

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ratios = Doctrine_Core::getTable('A')
                ->createQuery('a')
                ->leftJoin('a.m1 m1')
    //            ->leftJoin('a.autreRelation1_N ar')
                ->where('i.id=1')
    	    ->execute();
    echo count($ratios).' - '.$ratios->get(0)->getTexte().' : '
    .$ratios->get(0)->autreRelation1_N.' : '.$ratios->get(0)->getm1();
    Tu vois le ; entre l'instruction $ratio ... execute() et l'instruction echo ? C'est là que deux requêtes apparaissent dans la liste de la barre de debug de Symfony AVANT celle pour récupérer autreRelation1_N que j'ai volontairement commenté et celle que Symfony génère de nouveau (malgré trois requêtes déjà !) pour afficher $ratios->get(0)->getm1().

    En décommentant la requête pour autreRelation1_N part mais pas les trois autres.

    [edit]
    suite du message supprimé : j'ai identifié l'origine du problème que j'y évoquais
    [/edit]

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 71
    Points : 60
    Points
    60
    Par défaut Résolution partielle
    Concernant les requêtes magiquement créée, j'en ai trouvé l'origine : des méthodes de la classe de base écrasées par la classe fille (créées par le développeur précédent dont je reprends le code et qui n'avait pas indiqué cela dans la doc).

    Concernant la non liaison entre tables pourtant reliées, cela vient du fait que la relation est en fait multiple, la seconde table étant une association et non une entité, que Symfony habitue à ne pas s'en rendre compte :
    - en autorisant la sélection de données à l'aide d'une seule clé, voire en complétant les clés par magie grâce à des variables globales,
    - en n'avertissant jamais d'un souci et de son origine, ou de la compensation par magie d'un manque comme dans le point précédent, en particulier en développement, donc en laissant croire que c'est le fonctionnement normal.

    Ainsi face à un problème et des automatismes acquis d'écriture, on en oublie facilement les contraintes du schéma.


    Reste le problème initial : les deux attributs clés étrangères de la même table qui ne sont pas liées malgré la requête qui le demande.
    Est-ce que ça pourrait être une mauvaise configuration de schema.yml ?

Discussions similaires

  1. Occurence d'une valeur sur deux champs de la même table
    Par arihane dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/02/2015, 20h30
  2. [MySQL] Jointure: Avec deux champs d'une même table
    Par Vinuto dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 25/11/2008, 20h10
  3. [AJAX] Gestion de deux listes sur une même table
    Par kabkab dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/01/2008, 13h48
  4. Jointure entre deux champs d'une même table
    Par oubli dans le forum Requêtes
    Réponses: 8
    Dernier message: 11/12/2007, 16h20
  5. Fusion de deux requetes sur une même table
    Par jojosbiz dans le forum Langage SQL
    Réponses: 6
    Dernier message: 25/06/2007, 09h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo