我想了解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中,我需要 实体 来生成查询,在这种情况下,我没有与表相关联的实体,users_group因为该表是由框架自动创建的。
users_group
那么,如何检索与此关系表有关的信息?例如,我需要获取组中的所有用户,这些用户的ID出现在表中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查询中提及连接表
groups
User