2016-04-13 4 views
1

Symfony2でDoctrineのquerybuilderを使用して、エンティティを取得するためのクエリを作成しています。LEFT JOIN ONまたはDoctrineでの操作方法

私はMySQLではこの結果を取得しようとしている:

SELECT u0_.id AS id0 
FROM user u0_ 
LEFT JOIN rva_victims r3_ ON u0_.id = r3_.user_id 
INNER JOIN rva r1_ ON r1_.id = r3_.rva_id or u0_.id = r1_.declarant_id 

私は$ QB-の両方ONし、ConditionTypeをWITH試してみた>(参加)、何も動作します。

私の問題を解決するための任意のアイデアを教えてください。

答えて

1

解決策はかなり簡単です。あなたのケースでは、リポジトリークラスでyou§reを想定し、次のようになります。

$this 
    ->createQureyBuilder('u') 
    ->leftJoin(Victims::class, 'v', Query\Expr\Join::WITH, 'v.user = u.id') 
    ->join(Rva::class, 'r', Query\Expr\Join::WITH, 'r.id = v.rva OR u.id = r.declarant'); 

これは正常に動作する必要がありますが、私はちょうど今のクラス名を想定しています。すべての条件が列名ではなくクラス属性名(DQL)に対して行われることも考慮してください。

+0

これを行うことができます私の問題は、被害者であるとRVAは同じエンティティです。 実際、Rva @ ManyToMany( "User")とRaven @ ManyToOne( "User")という犠牲者属性を含むRvaエンティティがあります。 私はすべての被害者と宣告者を同じ要請で取得する必要があります。 あなたの参加の私の問題は、結果が得られるので、WITHです:INNER JOIN rva r4_ ON u0_.id = r4_.declarant_id AND(r4_.declarant_id IN(?)OR u0_.id = r4_.declarant_id) – KeurbyCandy

+0

Can関係するモデル定義で質問を更新してください。問題が何であるかがはっきりしています。 –

0

あなたは、エンティティリポジトリにクエリビルダを作成することにより、

$qb = $this->createQueryBuilder('u') 
    ->leftJoin('yourbundle:Entityname', 'ye', 'WITH', 'u0_.id = r3_.user_id') 
    ->innerJoin('yourbuncle:entityname', 'yen', 'WITH', 'r1_.id = r3_.rva_id', 'OR', 'u0_.id = r1_.declarant_id'); 
+0

エラー: 'OR'はクラスを指しません。 ' – KeurbyCandy

+0

' r1_.id = r3_のように入力しようとしましたか? rva_id OR u0_.id = r1_.declarant_id '...また、mysqlクライアント上でそのsqlクエリを使用したい行を取得しましたか – Sasser