小编典典

在具有左联接多对多单向关系的用户中,在Doctrine DQL中选择count(),其中用户没有关系特定的组

sql

情景:我正在尝试为不在特定组中的用户选择DQL中的count()。

User和(和)中的Group实体之间的标准ManyToMany单向关系。系统:Symfony 2.5,Doctrine
2.4。FOSUserBundle``SonataUserBundle

实体用户

PS这不是真实的代码复制。 这是不可能的,因为有几层使用不同的配置文件以不同的格式和位置扩展,所以如果发现错误的类型,这不是问题。

namespace RAZ\UserBundle\Entity;
/**
 * @ORM\Table(name="fos_user_user")
 */
class User
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var Collection
     *
     * @ORM\ManyToMany(targetEntity="Group")
     * @ORM\JoinTable(name="fos_user_user_group")
     */
    protected $groups;
}

实体组

namespace RAZ\UserBundle\Entity;
/**
 * @ORM\Table(name="fos_user_group")
 */
class Group
{
/**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
}

问题:这甚至可以在DQL中完成吗?

问题非常相似:
如何获得多对多关系中没有与DQL和Doctrine对应的链接实体的实体?区别在于我只需要检查一个特定的组。

有效的SQL(返回1423):

SELECT COUNT(*) cnt
FROM fos_user_user u
LEFT JOIN fos_user_user_group dug ON u.id = dug.user_id AND dug.group_id = 70
WHERE dug.user_id IS NULL

DQL工作不正确(返回3208):

SELECT COUNT(u)
FROM RAZUserBundle:User u
LEFT JOIN u.groups dug WITH dug.id = 70
WHERE dug IS NULL

问题是DQL生成不同的SQL:

SELECT COUNT(u.id)
FROM fos_user_user u
LEFT JOIN fos_user_user_group ug ON u.id = ug.user_id
LEFT JOIN fos_user_group g ON g.id = ug.group_id AND (g.id = 70)
WHERE g.id IS NULL

有什么建议?


阅读 170

收藏
2021-05-23

共1个答案

小编典典

我设法在DQL中做到的唯一方法是使用子查询:

SELECT COUNT(u)
FROM RAZUserBundle:User u
WHERE u.id NOT IN (
    SELECT u2.id
    FROM RAZUserBundle:User u2
    JOIN u2.groups g WITH g.id = 70
)
2021-05-23