Я triyng, чтобы понять, как многие из многих отношений работают с Doctrine и Symfony2.
Я воссоздал пример, показанный в официальной документации (goo.gl/GYcVE0), и у меня есть два класса Entity: User и Group, как вы можете видеть ниже.
<?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 для генерации запроса, и в этом случае у меня нет users_group
Entity, связанного с таблицей users_group
потому что эта таблица создается автоматически каркасом.
Итак, как я могу получить информацию, связанную с этой таблицей отношений? Например, мне нужно получить всех пользователей в группе, которые являются пользователями, у которых есть идентификатор, который отображается в таблице users_group
.
Как я могу это сделать с помощью DQL, QueryBuilder или других методов?
Большое спасибо.
Вы можете написать запрос 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-запросе