2015-12-07 56 views
6

我在寫一個具有三個類(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來引用連接表本身?如果不是,是否有其他類型的關係架構可以解決這個問題?

回答

0

在我看來,您的主要關注點應該是您的數據庫中存在多對多關係,而不是代碼無法正常工作。

使用兩個查詢的聯合來創建視圖。在一個查詢中從組中收集用戶標識,然後從另一個查詢中的獨立用戶收集用戶標識。一旦你有了看法,你可以做你的重要。

+0

你能提供一個例子嗎?我不確定如何在DQL或Doctrine查詢生成器中進行聯合。 – Waddles