带有连接表和两个连接的DQL查询

use*_*963 5 doctrine dql symfony

我有2个实体:

/**
 * @ORM\Entity
 * @ORM\Table(name="users")
 */
class User
{
    /**
     * @ORM\ManyToMany(targetEntity="Myapp\UserBundle\Entity\Group")
     * @ORM\JoinTable(name="user_groups",
     *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
     * )
     */
    protected $groups;

    ...
}
Run Code Online (Sandbox Code Playgroud)

/**
 * @ORM\Entity(repositoryClass="Myapp\UserBundle\Repository\GroupRepository")
 * @ORM\Table(name="groups")
 */
class Group
  ...
Run Code Online (Sandbox Code Playgroud)

我找不到一种方法来创建一个DQL查询,结果如下:

SELECT g.name, g.id, count( u.id )
FROM users u
LEFT JOIN user_groups ug ON u.id = ug.user_id
RIGHT JOIN groups g ON g.id = ug.group_id
GROUP BY g.id
Run Code Online (Sandbox Code Playgroud)

我试过并失败了:

$this->getEntityManager()
    ->createQuery('
        SELECT g.id, g.name, count(u.id) as usercount FROM MyappUserBundle:User u
        JOIN u.groups g
        GROUP BY g.id'
    );
Run Code Online (Sandbox Code Playgroud)

因为结果不包含没有用户的组.

Alt*_*PHP 2

这是一个多对多关系,不要尝试连接关系表,只连接相关实体...然后,对于 SQL 查询,您使用 RIGHT JOIN ...是正确的,但是 Doctrine 自动定义来自FROM 子句。

在 DQL 中,只有定义的关系由连接管理,因此您不需要 USE 或 ON 子句...

这个如何 ?

SELECT g.name, g.id, count( u.id )
FROM groups g
JOIN users u
GROUP BY g.id
Run Code Online (Sandbox Code Playgroud)