【问题标题】:Multiple join conditions over a Many to Many relationship多对多关系上的多个连接条件
【发布时间】:2016-03-11 15:46:40
【问题描述】:

我正在编写一个包含三个类的应用程序,用户、帖子和组。

用户可以发帖,但可以代表他们自己和/或代表他们的某个群组发帖。两个或多个用户也可以在没有组的情况下相互联合发帖。我正在尝试找到一种方法来计算用户关联的帖子数量,无论是通过他们自己还是通过他们的一个组,并且在两个关联只存在于一个帖子的情况下,它应该只算作一个.

用户:

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

    /**
     * @ManyToMany(targetEntity="Group", inversedBy="users")
     */
    private $groups;

以及其他两个实体上的等效映射。

我写了一个 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 语言的方法。问题来自于连接到多对多连接表的必要性,而不是实体表本身。过去,我可以使用“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”和“g.posts”引用表而不是字段。

我不确定 Doctrine 是否能够进行这种查询,我更希望在数据库端进行,因为可能需要处理大量数据集,这需要订购通过结果集中的计数。

有什么方法可以使用 DQL 引用连接表本身?如果没有,是否有另一种关系架构可以解决这个问题?

【问题讨论】:

    标签: php mysql symfony doctrine-orm


    【解决方案1】:

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

    使用两个查询的联合创建一个视图。在一个查询中从组中收集用户 ID,然后在另一个查询中从独立用户那里收集用户 ID。获得视图后,您可以进行计数。

    【讨论】:

    • 你能提供一个例子吗?我不确定如何在 DQL 或 Doctrine Query Builder 中进行联合。
    猜你喜欢
    • 2019-08-22
    • 2014-05-12
    • 2023-03-04
    • 2019-02-12
    • 2015-03-22
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多