2012-03-29 17 views
6

Doctrine 2で多対多の問合せを実行する方法を理解しようとしていますが、答えが見つからないようです。私はまっすぐにSQLでそれをやる方法を正確に知っています:Doctrine 2の多対多問合せ

 SELECT ma.id, 
      ma.name 
     FROM user u 
     JOIN user_media_area uma ON uma.user_id = u.id 
     JOIN media_area ma ON uma.media_area_id = ma.id 

私はDoctrineでこの同じことをどうしますか?

+2

この質問はなぜ控除ですか? –

答えて

5

マニュアルでは、いくつかの良い例があります:http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/query-builder.html

あなたのケースでは、それは次のようになります。

// Build query 
    $em = $this->getEntityManager(); 
    $qb = $em->createQueryBuilder(); 

    $qb->addSelect('user'); 
    $qb->addSelect('mediaArea'); 

    $qb->from('SomeBundle:User','user'); 

    $qb->leftJoin('user.userMediaArea','userMediaArea'); 
    $qb->leftJoin('userMediaArea.mediaArea','mediaArea'); 

    $query = $qb->getQuery(); 
    $users = $query->getResult(); 
    echo $users[0]->getUserMediaArea()->getName(); 

をあなたのエンティティのコードを投稿していなかったので、私はあなたがどのように定義したか、いくつかの推測をしなければなりませんでした関係。 UserとMediaAreaの間に単純なManyToManyがある場合は、UserMediaArea結合をスキップできます。 D2はそれを理解します。 MediaAreaの情報だけが本当に必要なので、私は実際にはクエリーを逆にしてMediaAreaから選択して、ユーザー情報を返す必要はありません。しかし、元のクエリに従おうとしていました。

+0

ありがとう!それはうまくいった。 (オリジナルのコードを幾分編集しましたが、このコメントの時点で編集はまだピアレビューされていません。)特に、実際に私の質問を理解し、あなたの答えにエンティティ名を使用していただきありがとうございます。 –

+0

@Ceradには、結果セットマッピングを使ってネイティブSQLでこれを行う方法があります。 – hardik

+0

悲しいことに、私がSQLを(パフォーマンス上の理由から)使用しなければならなかったいくつかのケースでは、私は自分自身でマッピングを行います。 – Cerad

-1
SELECT ma.id, ma.name 
FROM User u 
JOIN u.media 

ユーザーはUserエンティティで、u.mediaはMediaエンティティです。

+1

返事をありがとう。 PHPの部分はどうですか?どうしたの? –

+0

$ sql = 'SELECT ma.id、ma.name FROM User u JOIN u.media'; \t $ result = $ entityManager-> createQuery($ sql) - > getResult(); –

+0

私はこれを試していませんでした。厳密に検査すると、あなたのDQLは私の結合テーブルを参照することさえありません。あなたの「馬」はどこから来るのですか?また、「メディア」というものはありません。あなたが私の質問を読んだり、あなたの答えをあまりにも慎重に校正しているかどうかは分かりません –

関連する問題