2015-12-07 23 views
6

ユーザー、投稿、グループの3つのクラスを持つアプリケーションを作成しています。多対多関係の複数の結合条件

ユーザーは投稿を行うことができますが、自分自身のために、および/またはグループの1人のために行うことができます。 2人以上のユーザーは、グループなしで、互いに関連して投稿を行うこともできます。私は自分自身やグループのいずれかを問わず、ユーザーが関連している投稿の数を数える方法を見つけようとしています。両方のアソシエーションが1つの投稿のみに存在する場合は、 。

ユーザー:他の二つのentites上

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

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

と同等のmappedBy。

私は私のユーザーのリスト、および彼らが関連付けられている投稿の量を与えるこの

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 

を解決するためのようだMySQLのクエリを書いています。

この種のクエリをORM言語に書き込む方法を見つけるのが難しいです。この問題は、エンティティのテーブル自体ではなく、ManyToManyの結合テーブルに参加する必要があることから発生します。これまで、私は 'WITH'ステートメントを使ってcondtional joinを書くことができました。

$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

あなたの主な関心事は、コードが正しく機能しないという事実ではなく、データベースに多対多の関係があるという事実です。

2つのクエリの和集合でビューを作成します。 1つのクエリのグループからユーザーIDを収集し、次に別のクエリの独立ユーザーからユーザーIDを収集します。一度あなたはあなたのカウントを行うことができますビューを持っています。

+0

例を挙げることはできますか?私はDQLやDoctrine Query Builderでどのように組合を行うのか分かりません。 – Waddles