ManyToManyの使用 2つのエンティティ間には、DQL(doctrine query)を構築するときに、このタイプのリレーションで一般にジャンクションテーブルと呼ばれる3番目のテーブルが含まれます。ドクトリンは、アノテーションとして定義したリレーションの性質に応じてジャンクションテーブルを自動的に結合するため、クエリを考慮します
$teamsingroup = $em->getRepository("AppBundle\Model\Entity\Team")
->createQueryBuilder('o')
->innerJoin('o.group', 't')
Teamに参加しています Groupを持つエンティティ innerJoin('o.group')のエンティティ パートo チームエンティティとo.groupのエイリアスです Teamで定義されたプロパティを指します groupという名前のエンティティ 。
/**
* @ORM\ManyToMany(targetEntity="Groups", mappedBy="team")
*/
protected $group;
ManyToManyがあります このタイプの関係ドクトリンに対して定義されたアノテーションは、最初にチームテーブルをジャンクションテーブルと結合し、次にジャンクションテーブルをグループテーブルと結合します。結果のSQLは次のようになります
SELECT t.*
FROM teams t
INNER JOIN junction_table jt ON(t.id = jt.team_id)
INNER JOIN groups g ON(g.id = jt.group_id)
WHERE g.id = @group_id
各グループのチームを取得する方法に関連するもう1つの点は、createQueryBuilderを除外することでコードを最小限に抑えることができることです。 チームプロパティをArrayCollectionとして定義したら、ループ内の一部 つまり、$this->team = new ArrayCollection(); 各グループオブジェクトで、getTeam()を呼び出すことにより、その特定のグループに関連付けられたチームのコレクションを取得します。 以下のコードと同様に、グループオブジェクトで機能します。
foreach ($groups as $group) {
$teamsingroup = $group->getTeam();
echo "</b>".$group->getGroupname()."</b></br>";
foreach ($teamsingroup as $teamingroup) {
echo $teamingroup->getTeam()."</br>";
}
}