我在寫一個具有三個類(Users,Posts和Groups)的應用程序。多對多關係中的多個連接條件
用戶可以發表帖子,但可以代表他們自己和/或代表他們的一個組進行發佈。兩個或更多用戶也可以彼此結合發表帖子,而不需要羣組。我試圖找到一種方法來計算用戶關聯的帖子數量,無論是通過他們自己還是他們的一個組,並且在兩個關聯僅存在於一個帖子的情況下,它應該只計爲一個。
用戶:
class User {
/**
* @ManyToMany(targetEntity="Post", inversedBy="users")
*/
private $posts;
/**
* @ManyToMany(targetEntity="Group", inversedBy="users")
*/
private $groups;
和其它兩個的entites等效的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來引用連接表本身?如果不是,是否有其他類型的關係架構可以解決這個問題?
你能提供一個例子嗎?我不確定如何在DQL或Doctrine查詢生成器中進行聯合。 – Waddles