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

PHP & Base de données Discussion :

[Doctrine] Jointure multiple sur la même table


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Points : 6
    Points
    6
    Par défaut [Doctrine] Jointure multiple sur la même table
    bonjour à tous,

    alors mon petit problème avec Doctrine.
    j'ai troistables dans ma base :

    utilisateur
    -----------
    idutilisateur
    nom
    prenom
    email

    article
    ------------
    idcontenu
    detail

    contenu
    -----------
    idcontenu
    titre
    publie
    datecreation
    datemodification
    idutilisateurcreation
    idutilisateurmodification


    dans la table contenu j'ai deux clé étrangères vers la table utilisateur sur idutilisateurcreation et idutilisateurmodification.

    voici la requête doctrine que j'exécute pour obtenir les données de l'article avec celles de son contenu et des utilisateurs ayant intervenu.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $q = Doctrine_Query::create()
    			->select('a.*, c.*, uCrea.*, uModif.*')
    			->from('Articles a')
    			->leftJoin('a.Contenus c')
    			->leftJoin('c.Utilisateurs uCrea ON uCrea.idutilisateur=c.idutilisateurcreation')
    			->leftJoin('c.Utilisateurs uModif ON uModif.idutilisateur=c.idutilisateurmodification')
    			->where('a.idcontenu=?', $idcontenu);
    voici la requête SQL générée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT 
      a.idcontenu AS a__idcontenu, a.detail AS a__detail, 
      c.idcontenu AS c__idcontenu, c.titre AS c__titre, c.publie AS c__publie, c.datecreation AS c__datecreation, c.datemodification AS c__datemodification, c.idutilisateurcreation AS c__idutilisateurcreation, c.idutilisateurmodification AS c__idutilisateurmodification, 
      u.idutilisateur AS u__idutilisateur, u.email AS u__email, u.nom AS u__nom, u.prenom AS u__prenom, 
      u2.idutilisateur AS u2__idutilisateur, u2.email AS u2__email, u2.nom AS u2__nom, u2.prenom AS u2__prenom 
    FROM 
      articles a LEFT JOIN contenus c ON a.idcontenu = c.idcontenu 
      LEFT JOIN utilisateurs u ON (u.idutilisateur = c.idutilisateurcreation) 
      LEFT JOIN utilisateurs u2 ON (u2.idutilisateur = c.idutilisateurmodification) 
    WHERE
      (a.idcontenu = ?)
    la requête SQL générée remonte bien toutes données attendus, u et u2 correspondant respectivement à l'utilisateur création et à l'utilisateur modification.
    par contre lorsque j'exécute la version DQL et que j'affiche le résultat sous forme de tableau, seul les données de l'utilisateur création sont remontées :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    Array
    (
        [idcontenu] => 2
        [detail] => detail
        [Contenus] => Array
            (
                [idcontenu] => 2
                [titre] => article 1
                [publie] => 0
                [datecreation] => 2010-04-20 00:00:00
                [datemodification] => 2010-04-20 00:00:00
                [idutilisateurcreation] => 1
                [idutilisateurmodification] => 2
                [Utilisateurs] => Array
                    (
                        [idutilisateur] => 1
                        [email] => toto@gmail.com
                        [nom] => mobile
                        [prenom] => toto
                    )
    
            )
    
    )
    si quelqu'un a déjà manipulé ce genre de requête avec Doctrine et qu'il a trouvé comment faire pour avoir toutes les données je suis à votre écoute .

  2. #2
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    le problème vient de la requête DQL
    en effet lorsque que l'on définit ses objets dans le fichier YAML on définit aussi les relations entre objet.
    personnellement je génère mon YAML automatiquement en me connectant à ma base à l'aide de Doctrine.

    pour mon cas Doctrine a créé ces relations :
    relations:
    Utilisateurs:
    class: Utilisateurs
    local: idutilisateurcreation
    foreign: idutilisateur
    type: one
    Utilisateurs_2:
    class: Utilisateurs
    local: idutilisateurmodification
    foreign: idutilisateur
    type: one

    il faut donc utiliser l'objet Utilisateurs_2 pour obtenir les données sur l'utilisateur "modification" ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $q = Doctrine_Query::create()
    	->select('a.*, c.*, uCrea.*, uModif.*')
    	->from('Articles a')
    	->leftJoin('a.Contenus c')
    	->leftJoin('c.Utilisateurs uCrea ON uCrea.idutilisateur=c.idutilisateurcreation')
    	->leftJoin('c.Utilisateurs_2 uModif ON uModif.idutilisateur=c.idutilisateurmodification')

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Jointure externe sur une même table
    Par jeff69 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 14/09/2009, 22h11
  2. Jointures multiples sur une même table
    Par hjhjhj dans le forum Langage SQL
    Réponses: 10
    Dernier message: 08/05/2009, 16h48
  3. Jointure multiple sur la meme table
    Par metrax dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/06/2008, 11h03
  4. Accès multiple sur une même table
    Par ravaid dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 18/04/2008, 14h09
  5. Accès multiple sur une même table
    Par ravaid dans le forum Développement
    Réponses: 3
    Dernier message: 18/04/2008, 13h27

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