使用 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) 中显示的示例,并且我有两个实体类:UserGroup,如下所示.

<?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 用类似-&gt;where('g.name= :group_name')-&gt;setParameter('group_name', $group_name)的组名调整where部分 嘿,我发布了 question 引用您的答案,我需要解释一下 innerJoin 的工作原理,您可能会感兴趣 正是我需要了解 Doctrine 如何处理多对多关系的内容,非常感谢。

以上是关于使用 Doctrine 和 Symfony2 查询多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Doctrine 在 Symfony2 中实现子查询?

Symfony2 Doctrine 错误:无法计算使用 HAVING 子句的查询。使用输出步行器进行分页

如何使用doctrine查询symfony2中实体类中的另一个实体

如何让 Doctrine 在 Symfony2 中记录查询

如何在 Doctrine2 (Symfony2) 中按案例排序

Symfony2/Doctrine - 与普通 SQL 相关的实体抽象