2016-07-04 4 views
1

私は、研究所とコースの多対多の関係を持っています。私は、いくつかのコースが割り当てられている機関リストだけを返すクエリを作成したい。私はこの状況でone to manyの質問を書いています。ただし、many to manyではありません。ここには関係があります。Symfony Doctrine問合せの多少の問合せ

class Institutes { 

    /** 
    * @ORM\ManyToMany(targetEntity="Courses", inversedBy="institutes") 
    * @ORM\JoinTable(name="institute_courses", 
    *  joinColumns={@ORM\JoinColumn(name="institute_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="course_id", referencedColumnName="id")} 
    *  ) 
    */ 
    protected $courses; 
} 

class Courses { 

    /** 
    * @ORM\ManyToMany(targetEntity="Institutes", mappedBy="courses") 
    */ 
    protected $institutes; 
} 

ここには私が書いたクエリがありますが、正しく機能しませんでした。

$repository->createQueryBuilder('s') 
         ->leftJoin('CoursesBundle:Courses','c', 'ON c.institutes = s.courses') 
         ->where('s.active = :active') 
         ->andWhere('s.verified = :active') 
         ->setParameter('active', true) 
         ->orderBy('s.name', 'ASC'); 
+0

左のジョイントを内側のジョイントに置き換えようとします。コースで施設のみをターゲットにしたい場合は – jiboulex

答えて

1

これはトリックを行う必要があります。

$repository->createQueryBuilder('i') 
    ->innerJoin('i.courses','c') 
    ->where('i.active = TRUE') 
    ->andWhere('i.verified = TRUE') 
    ->orderBy('i.name', 'ASC'); 
+0

いいえ、すべての機関を返します。 –

+0

申し訳ありません、私は編集しました。私はあなたの質問を誤読しました。 – Terenoth

0

JOINは、他の種類の関連付けと同じように使用できます。

SELECT c FROM SomeBundle:Courses c JOIN c.institutes i 

あなたが参加する条件を追加することにより、更なる結果を絞り込むことができます:次のクエリは、少なくとも一つの機関に割り当てられているすべてのコースがあります

SELECT c FROM SomeBundle:Courses c JOIN c.institutes i WITH i.something = :someParam 
+0

コースではなく研究所を選択する必要があります。 –

+0

Hmm。それを逃した。それに応じてクエリを変更します。私はすでにあなたにこれをどうやって*示したのですか? – ShiraNai7