Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony2] QueryBuilder et jointure ManyToMany

Comment construire une requête ManyToMany avec le QueryBuilder

Anonyme
    18 janvier 2013 à 1:01:40

    Bonjour à tous,

    Je rencontre un nouvel obstacle dans mon apprentissage de Symfony2,

    j'ai 3 tables, à savoir userstasks et task_user, cette dernière étant une table intermédiaire représentant la relation ManyToMany entre un User et une Task (une relation ManyToMany unidirectionnelle est définie via annotation dans l'entity Task).

    Je voudrais retrouver toutes les Task liées à un User donné, ma requête en SQL devrait correspondre à la suivante :

    SELECT * FROM tasks AS t
    INNER JOIN task_user AS tu ON tu.task_id = t.id
    WHERE tu.user_id = ?

    J'ai a peu prêt essayé par tout les moyens de reformuler cette requête en utilisant le QueryBuilder mais rien n'y fait,

    je me tourne donc vers vous,

    Merci d'avance

    • Partager sur Facebook
    • Partager sur Twitter
      18 janvier 2013 à 4:56:27

      Salut pour te répondre proprement j'ai besoin de voir tes entités.

      Ceci dit, si je fais l'hypothèse que dans User tu as un champ $task et dans Task tu as un champ $user il faudrait faire comme ça :

      $query = $this->_em->createQuery('SELECT t, u FROM MyBundle:Task t JOIN t.user u WHERE t.user = :id);
      
      $query->setParameter('id', $user);


      A tester, dis moi si c'est bon.

      • Partager sur Facebook
      • Partager sur Twitter
        18 janvier 2013 à 9:35:37

        Salut,
        Tu raisonnes en tables : c'est le mal incarné. Tu manipules Doctrine, pas les tables directement, donc "la table task_user" est une notion tout à fait inexistante donc tu ne devrais même pas parler. Il faut penser objet, donc juste Task et User.
        Soit tu as une relation bidirectionnelle (donc attribut $tasks dans User), et tu as déjà récupéré ton User. Dans ce cas c'est ultra simple :
        $user->getTasks(); // requête déclenchée
        Soit tu as une relation bidirectionnelle et tu veux récupérer le User en même temps pour ne faire qu'une seule requête. Dans ce cas, depuis le repository User :
        $user = $this->createQueryBuilder('u')->join('u.tasks', 't')->addSelect('t')->where('u.id = :id');
        
        $tasks = $user->getTasks(); // pas de nouvelle requête déclenché
        Soit tu as une relation unidirectionnelle et tu as déjà récupéré ton User. Dans ce cas, depuis le repository Task :
        $tasks = $this->createQueryBuilder('t')->join('t.users', 'u', 'WITH', 'u.id = :id');
        • Partager sur Facebook
        • Partager sur Twitter

        [Symfony2] QueryBuilder et jointure ManyToMany

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown