使用 Doctrine 和 Symfony2 查询多对多关系
Posted
技术标签:
【中文标题】使用 Doctrine 和 Symfony2 查询多对多关系【英文标题】:Query on a many-to-many relationship using Doctrine with Symfony2 【发布时间】:2014-12-20 08:42:00 【问题描述】:我试图了解多对多关系如何与 Doctrine 和 Symfony2 一起工作。
我重新创建了官方文档 (goo.gl/GYcVE0) 中显示的示例,并且我有两个实体类: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
关联的实体,因为该表是由框架。
那么,我怎样才能检索到这个关系表的相关信息呢?例如,我需要获取组中的所有用户,这些用户的 id 出现在表 users_group
中。
如何使用 DQL、QueryBuilder 或其他方法来做到这一点?
非常感谢。
【问题讨论】:
你的标准是什么你可以为你的标准编写mysql查询吗?所以我们会尝试在 DQL 查询中翻译它 @M Khalid Junaid 例如,我需要获取组中的所有用户。使用原始 SQL 应该类似于 SELECT u.id, u.name FROM Users u, Group g, users_group ug WHERE ug.group_id=5 AND u.id=ud.user_id。如您所见,我需要与表 users_group 相关的实体。 【参考方案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();
User
实体中 groups
属性的映射将自行处理连接部分,您不必在 DQL 查询中提及联结表
【讨论】:
谢谢,很有帮助 ;-) 如果有组名而不是组ID应该查询什么? @Vidhi 用类似->where('g.name= :group_name')->setParameter('group_name', $group_name)
的组名调整where部分
嘿,我发布了 question 引用您的答案,我需要解释一下 innerJoin 的工作原理,您可能会感兴趣
正是我需要了解 Doctrine 如何处理多对多关系的内容,非常感谢。以上是关于使用 Doctrine 和 Symfony2 查询多对多关系的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Doctrine 在 Symfony2 中实现子查询?
Symfony2 Doctrine 错误:无法计算使用 HAVING 子句的查询。使用输出步行器进行分页
如何使用doctrine查询symfony2中实体类中的另一个实体