Utilisation de ManyToMany
entre 2 entités implique une troisième table généralement appelée table de jonction dans ce type de relation lorsque vous construisez une doctrine DQL (requête de doctrine) rejoint automatiquement la table de jonction en fonction de la nature de la relation que vous avez définie comme annotation donc en tenant compte de votre requête
$teamsingroup = $em->getRepository("AppBundle\Model\Entity\Team")
->createQueryBuilder('o')
->innerJoin('o.group', 't')
Vous rejoignez Team
entité avec Group
entité dans innerJoin('o.group')
partie o
est l'alias pour l'entité Team et o.group
fait référence à la propriété définie dans Team
entité nommée group
.
/**
* @ORM\ManyToMany(targetEntity="Groups", mappedBy="team")
*/
protected $group;
Qui a un ManyToMany
l'annotation définie pour ce type de doctrine de relation rejoint d'abord votre table d'équipe avec la table de jonction, puis joint votre table de jonction avec la table des groupes et le SQL résultant sera quelque chose comme
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
Une autre chose liée à votre façon d'obtenir une équipe pour chaque groupe, vous pouvez minimiser votre code en excluant createQueryBuilder
partie dans la boucle, une fois que vous avez défini la propriété teams comme ArrayCollection
c'est-à-dire $this->team = new ArrayCollection();
sur chaque objet de groupe, vous obtiendrez des collections d'équipes associées à ce groupe particulier en appelant getTeam()
fonction sur l'objet de groupe similaire au code ci-dessous.
foreach ($groups as $group) {
$teamsingroup = $group->getTeam();
echo "</b>".$group->getGroupname()."</b></br>";
foreach ($teamsingroup as $teamingroup) {
echo $teamingroup->getTeam()."</br>";
}
}