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>";
}
}