我有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;
...
}
和
/**
* @ORM\Entity(repositoryClass="Myapp\UserBundle\Repository\GroupRepository")
* @ORM\Table(name="groups")
*/
class Group
...
我无法找到一种方法来创建一个DQL查询,从而产生如下SQL:
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
我试过并失败了:
$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'
);
因为结果不包含没有用户的组。
答案 0 :(得分:2)
这是一个ManyToMany关系,不要事件尝试加入关系表,只关联实体... 然后,对于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