一尘不染

使用带有Symfony2的Doctrine查询多对多关系

mysql

我想了解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因为该表是由框架自动创建的。

那么,如何检索与此关系表有关的信息?例如,我需要获取组中的所有用户,这些用户的ID出现在表中users_group

如何使用DQL,QueryBuilder或其他方法做到这一点?

非常感谢。


阅读 220

收藏
2020-05-17

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

groupsUser实体中对属性的映射将处理连接部分本身,而您无需在DQL查询中提及连接表

2020-05-17