Запрос на отношения "многие-ко-многим" с использованием Доктрины с Symfony2

Я triyng, чтобы понять, как отношения многих и многих взаимодействуют с Doctrine и Symfony2.

Я воссоздал пример, показанный в официальной документации (goo.gl/GYcVE0), и у меня есть два класса сущностей: Пользователь и Группа, как вы можете видеть ниже.

<?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();
    }

    // ...
}

Если я обновляю свою БД, я получаю эту схему 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);

Проблема заключается в том, что в Symfony2 мне нужна Entity для создания запроса, и в этом случае у меня нет объекта Entity, связанного с таблицей users_group, потому что эта таблица создается автоматически рамки.

Итак, как я могу получить информацию, связанную с этой таблицей отношений? Например, мне нужно получить всех пользователей в группе, которые являются пользователями, у которых есть идентификатор, который отображается в таблице users_group.

Как я могу это сделать с помощью DQL, QueryBuilder или других методов?

Большое спасибо.

Ответ 1

Вы можете написать запрос на объединение DQL, как показано ниже

$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();

Ваше сопоставление для свойства groups в объекте User будет обрабатывать часть соединения, вам не нужно упоминать таблицу переходов в вашем запросе DQL