web-dev-qa-db-fra.com

Requête sur une relation plusieurs-à-plusieurs en utilisant Doctrine avec Symfony2

Je cherche à comprendre comment fonctionne la relation plusieurs à plusieurs avec Doctrine et Symfony2.

J'ai recréé l'exemple montré dans la documentation officielle (goo.gl/GYcVE0) et j'ai deux classes d'entité: ser et Group comme vous pouvez le voir ci-dessous.

<?php
/** @Entity **/
class User
{
    // ...

    /**
     * @ManyToMany(targetEntity="Group", inversedBy="users")
     * @JoinTable(name="users_groups")
     **/
    private $groups;

    public function __construct() {
        $this->groups = new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ...
}

/** @Entity **/
class Group
{
    // ...
    /**
     * @ManyToMany(targetEntity="User", mappedBy="groups")
     **/
    private $users;

    public function __construct() {
        $this->users = new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ...
}

Si je mets à jour ma base de données, j'obtiens ce schéma MySQL:

CREATE TABLE User (
    id INT AUTO_INCREMENT NOT NULL,
    PRIMARY KEY(id)
) ENGINE = InnoDB;
CREATE TABLE users_groups (
    user_id INT NOT NULL,
    group_id INT NOT NULL,
    PRIMARY KEY(user_id, group_id)
) ENGINE = InnoDB;
CREATE TABLE Group (
    id INT AUTO_INCREMENT NOT NULL,
    PRIMARY KEY(id)
) ENGINE = InnoDB;
ALTER TABLE users_groups ADD FOREIGN KEY (user_id) REFERENCES User(id);
ALTER TABLE users_groups ADD FOREIGN KEY (group_id) REFERENCES Group(id);

Le problème est que dans Symfony2 j'ai besoin de Entity pour générer une requête et dans ce cas, je n'ai pas d'entité associée à la table users_group car cette table est créée automatiquement par le framework.

Alors, comment puis-je récupérer les informations relatives à cette table de relations? Par exemple, je dois obtenir tous les utilisateurs d'un groupe, qui sont les utilisateurs dont l'ID apparaît dans le tableau users_group.

Comment puis-je faire cela en utilisant le DQL, QueryBuilder ou d'autres méthodes?

Merci beaucoup.

16
Ema.jar

Vous pouvez écrire une requête de jointure DQL comme ci-dessous

$em = $this->getContainer()->get('doctrine')->getManager();
$repository = $em->getRepository('YourNamespaceYourBundle:User');
$query = $repository->createQueryBuilder('u')
    ->innerJoin('u.groups', 'g')
    ->where('g.id = :group_id')
    ->setParameter('group_id', 5)
    ->getQuery()->getResult();

Votre mappage pour la propriété groups dans l'entité User gérera la partie de jointure elle-même, vous n'avez pas à mentionner la table de jonction dans votre requête DQL

28
M Khalid Junaid