ユーザー、投稿、グループの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を使用して結合テーブル自体を参照する方法はありますか?そうでない場合は、これを解決する異なる種類のリレーショナルアーキテクチャがありますか?
例を挙げることはできますか?私はDQLやDoctrine Query Builderでどのように組合を行うのか分かりません。 – Waddles