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

Doctrine2 PHP Discussion :

Jointure sur plusieurs tables


Sujet :

Doctrine2 PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 81
    Par défaut Jointure sur plusieurs tables
    Bonjour à tous!

    Je me mets au jointures Doctrine 2 et j'ai quelques problèmes...

    Voici mon schéma :

    J'ai une table "event" qui comprend une relation OneToMany (et non ManyToOne) avec une table "comments" qui a une relation ManyToOne avec une table "user" qui a une relation OneToOne avec la table "infos_user".

    J'aimerai récupérer toutes ces infos dans une requête afin d'éviter de faire d'autres requête lors de l'affichage des infos sur la page "Event.html.twig" comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    {{ for comment in events.comments }}
    {{ comment.user.infos.name }} à commenté : {{ comment.text }} <br />
    {{ endfor }}
    Pour ça j'ai essayé dans le Repository :

    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
     
    public function getOneByProd($id, $titre)
    	{
    		return  $this->createQueryBuilder('e')
    		->join('e.comments', 'c')
    		->join('c.user', 'u')
    		->join('u.infos', 'i')
    		->addSelect('c')
    		->addSelect('u')
    		->addSelect('i')
    		->where('e.user = :id AND e.titreurl = :titre')
    		->setParameter('id', $id)
    		->setParameter('titre', $titre)
    		->getQuery()
    		->getOneOrNullResult();
    	}

    mais ce code plante lorsque le nombre de commentaires est égal à 0, donc il marche uniquement sur les pages qui ont déjà un commentaire... bref je pense que je ne fais pas du tout ce qu'il faut donc si qqn peut m'aiguiller...

    Dans la doc de Doctrine il ne parle pas de faire plusieurs jointure ? je suis certainement sur une mauvaise piste... bref j'ai besoin d'aide :-°

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Si tu met une clause WHERE sur user cela donnera un INNER JOIN en sql .

    Que veux tu récupérer au juste?
    ici tu ne récupéreres que les events ayant un /des commentaires de l'user 1.
    dans ta boucle sur les comments tu n'auras que:
    user 1 a commenté comment1
    user 1 a commenté comment2

    donc pas tout les commentaires

    si tu veux tous les events dont au moins un commentaire est de l'utilisateur 1 essaie quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $dql="SELECT e,c,u,i
    FROM MyBundle:Event e 
    JOIN e.comments c 
    JOIN c.user u WITH u.id=:id
    JOIN u.infos i 
     WHERE e.titreurl=:titre"
    (non testé)

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 81
    Par défaut
    Désolé je n'ai pas très bien décrit le contexte :

    en gros un utilisateur créé un event, et plusieurs commentaire sont attaché à cet event donc quand tu vois :

    ->where('e.user = :id AND e.titreurl = :titre')

    En fait c'est l'id du propriétaire de l'event et le titre correspond au titre de l'event.

    Pour le fait d'avoir un résultat nul au cas ou il n'y a pas de commentaires, j'ai résolu le problème en utilisant des jointure externe (leftJoin() à la place de join()) doc ça c'est ok. ma requete est devenu ça :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    	public function getOneByProd($id, $titre)
    	{
    		return  $this->createQueryBuilder('e')
    		->leftJoin('e.comments', 'c')
    		->leftJoin('c.user', 'u')
    		->leftJoin('u.infos', 'i')
    		->join('e.user', 'u2')
    		->leftJoin('u2.infos', 'i2')
    		->leftJoin('i2.followers', 'u3')
    		->leftJoin('e.progs', 'u4')
    		->leftJoin('u4.infos', 'i4')
    		->leftJoin('i4.followers', 'u5')
    		->leftJoin('i4.followers_requests', 'u6')
    		->leftJoin('i4.followers_blacklist', 'u7')
     
    		->addSelect('c')
    		->addSelect('u')
    		->addSelect('i')
    		->addSelect('u2')
    		->addSelect('i2')
    		->addSelect('u3')
    		->addSelect('u4')
    		->addSelect('i4')
    		->addSelect('u5')
    		->addSelect('u6')
    		->addSelect('u7')
     
     
    		->where('e.user = :id AND e.titreurl = :titre')
    		->setParameter('id', $id)
    		->setParameter('titre', $titre)
    		->getQuery()
    		->getOneOrNullResult();
    	}
    Tout ça marche bien sauf que pour un event comprenant 11 commentaires, cette requête me génère près de 800 résultats ! donc forcement c'est lent... je pense que mes lacunes en SQL m'empêche de comprendre comment faire ça proprement :-/

Discussions similaires

  1. Problème de jointure sur plusieurs tables
    Par papouuu dans le forum Langage SQL
    Réponses: 1
    Dernier message: 25/01/2011, 14h02
  2. [AC-2007] Jointure sur plusieurs tables
    Par Steph0 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 20/01/2011, 08h24
  3. jointure sur plusieurs tables fonctionne pas
    Par jmsch dans le forum Requêtes
    Réponses: 1
    Dernier message: 03/11/2010, 21h55
  4. Jointures sur plusieurs tables
    Par Daibai dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/12/2009, 09h55
  5. hibernate-criteria : jointure sur plusieurs tables
    Par loic72 dans le forum Hibernate
    Réponses: 9
    Dernier message: 24/09/2007, 17h27

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