gpt4 book ai didi

php - 多对多关系上的多个连接条件

转载 作者:可可西里 更新时间:2023-11-01 06:52:12 25 4
gpt4 key购买 nike

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

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

用户:

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”和“g.posts”引用表而不是字段。

我不太确定 Doctrine 是否能够执行这种查询,我更喜欢在数据库端完成,因为可能有一个大数据集要处理,并且需要订购根据结果​​集中的计数。

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

最佳答案

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

创建一个包含两个查询的联合 View 。在一个查询中从组中收集用户 ID,然后在另一个查询中从独立用户中收集用户 ID。获得 View 后,您就可以进行计数。

关于php - 多对多关系上的多个连接条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34126822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com