2011-10-25 2 views
0

のメンバーである:doctrine2は - エンティティは、例のため

私は、次のスキーマがあります。私は、特定のグループに属するユーザーを取得したい

users(id, name) 
groups(id,name) 
user_groups(user_id, group_id) 

を。問題は、私はグループIDを知っているので、私はグループテーブルに参加したくない - user_groupsで十分です。

結果はdoctrine2で

SELECT * FROM `users` AS u 
LEFT JOIN `user_groups` AS ug ON (ug.`user_id` = u.`id) 
WHERE ug.`group_id` = X 
// i know the value of X 

私の試みは、別の結果でなければなりませんgroups表の結合します。

私が得た最も近いものがある:

SELECT u FROM models\User u WHERE ?1 MEMBER OF u.groups 

が、それはまた、「WHERE EXISTS(...)」の内側にそれを左結合します

これはDQLを使用して(ネイティブクエリせずに行うことができます/クエリビルダ)?

ここ

答えて

0

がDQLでクエリです:

$query = $em->createQuery('SELECT u.id, u.name FROM Path\To\Users u LEFT JOIN u.groups g WHERE g.id = :group'); 
$query->setParameter('group', $group); 
$users = $query->getResult(); 

また、私はテーブルを結合するという点で、このようなクエリを考える傾向がありますが、教義はあなたが団体の面でそれについて考えるとき、より多くの意味を成しているようですエンティティに含まれるオブジェクトのコレクション。

+0

これはまったく間違っています。これは、私が避けようとしているgroupsテーブルをLEFT JOINします。質問 – galchen

+0

を読んでください誤解をおかけして申し訳ありません。私はあなたが自分のエンティティで確立した関連付けを使用したくない理由を理解している人に任せます。がんばろう。 – cantera

+0

私は、この場合を除いて、関連付けを使用しています - グループテーブルをLEFT JOINする理由はありません。 1つは、ユーザがグループのメンバーであるかどうかを見るためにuser_groupsをLEFT JOINすることができます(私はグループのIDを知っているので) – galchen

3

ORM over ActiveRecordパターンの利点の1つは、結合テーブル用に新しいエンティティを作成する必要がないことです。

ここでDoctrineを使用すると、user_groupsテーブルが両側にマップされます。

つまり、user_groupsテーブルに直接アクセスすることはできません。ネイティブSQLを使用しない限り、これは強くアドバイスします。

あなたの状況に取り組む最も良い方法は、グループrepoにfindOneBy($group_id)を使用して、そのユーザーを取得することです。それを理論的に正しい方法で実装すること。

- EDIT - あなたのコメントについては :

はい、私は純粋なデシベルのPOVからのより効率的なことに同意します。

DQL、クエリービルダーなどのネイティブクエリがなければ、これを実行することはできません。ドクトリンに関連するすべてのものがアクションを実行するためにエンティティを使用し、ORMを設計上使用しているため、テーブルを結合する。

これ以外の方法は、a many to many relation from user to groups using join tableからa one-to-many from users to user_groups and a many-to-one from user_groups to groupsにマッピングを変更することです。そうすればuser_groupsのエンティティを持つことになります。

次に、そのエンティティを直接使用してユーザーを取得できます。

そのハックであっても、その技術的には&はそのように使用するのが理論​​的に正しいわけではありません。もちろん、結合表には他の責任もあります。

+0

ですが、その結果2つのクエリになります。私の現在の手法では、左結合を追加するだけで1つのクエリが実行されます。私の現在のアプローチはより効率的です。 – galchen

+0

答えが大きすぎるので、私の上記をチェックしてください。 :) –

+0

この場合、グループを取得し、グループのユーザーの要求を取得するか、またはグループに属するすべてのユーザーを取得できます。私は後者をやっている - どちらも正しい(エンティティは賢明)。私が言っているのは、ORMをクエリが最適化され、必要なデータだけが処理されるように実装する必要があるということです。理論的には正しさの問題ではなく(両方の方法が正しいので)、ORMの実装効率に関する質問(使用する必要があるもののみを使用する)です。とにかく、入力ありがとう;) – galchen

関連する問題