多对多关系上的多个联接条件


Multiple join conditions over a Many to Many relationship

我正在编写一个应用程序,它有三个类,Users、Posts和Groups。

用户可以发帖,但可以代表他们自己和/或代表他们的一个组发帖。两个或两个以上的用户也可以在没有群组的情况下联合发布帖子。我正试图找到一种方法来计算用户关联的帖子数量,无论是通过他们自己还是他们的一个组,如果两个关联都只存在于一个帖子中,那么它应该只算作一个。

用户:

class User {
    /**
     * @ManyToMany(targetEntity="Post", inversedBy="users")
     */
    private $posts;
    /**
     * @ManyToMany(targetEntity="Group", inversedBy="users")
     */
    private $groups;

以及其他两个实体上的等价mappedBy。

我写了一个MySQL查询,似乎可以解决这个

SELECT COUNT(DISTINCT posts.id), users.name FROM users
LEFT JOIN post_user ON post_user.user_id = user.id
LEFT JOIN group_user ON group_user.user_id = user.id
LEFT JOIN post_group ON post_group.group_id = group_user.group_id
LEFT JOIN posts ON
    posts.id = post_user.post_id OR
    posts.id = post_group.post_id
GROUP BY users.id

这给了我一个用户列表,以及他们关联的帖子数量。

我很难找到将这种查询写入ORM语言的方法。问题来自于必须联接到ManyToMany联接表,而不是实体的表本身。在过去,我已经能够使用"WITH"语句编写条件联接。

$qb = $this->createQueryBuilder('u')
    ->select('COUNT(DISTINCT p.id), u.name')
    ->leftJoin('u.groups', 'g')
    ->leftJoin('MyBundle:Post', 'p', 'WITH', 'p = u.posts OR p = g.posts')

出现此错误

Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected.

很明显,问题源于"u.posts"answers"g.posts"引用的是表而不是字段。

我真的不确定Doctrine是否能够进行这种查询,我更希望在数据库端进行,因为可能有一个大的数据集需要处理,这需要根据结果集的计数进行排序。

是否有任何方法可以使用DQL引用联接表本身?如果没有,是否有另一种关系体系结构可以解决这个问题?

在我看来,您主要关心的应该是数据库中存在多对多关系,而不是代码无法正常工作。

创建一个包含两个查询的并集的视图。从一个查询中的组中收集用户id,然后从另一个查询的独立用户中收集用户id。一旦你有了视野,你就可以数数了。