Använder ManyToMany
mellan 2 entiteter involverar en tredje tabell som allmänt kallas en kopplingstabell i denna typ av relation när du bygger en DQL (doktrinfråga) doktrin ansluter automatiskt kopplingstabell beroende på vilken typ av relation du har definierat som anteckning så med tanke på din fråga
$teamsingroup = $em->getRepository("AppBundle\Model\Entity\Team")
->createQueryBuilder('o')
->innerJoin('o.group', 't')
Du går med i Team
enhet med Group
enhet i innerJoin('o.group')
del o
är aliaset för Team-entitet och o.group
hänvisar till egenskapen definierad i Team
enhet namngiven som group
.
/**
* @ORM\ManyToMany(targetEntity="Groups", mappedBy="team")
*/
protected $group;
Som har en ManyToMany
annotering definierad för den här typen av relationsdoktrin förenar din lagtabell först med kopplingstabell och ansluter sedan din kopplingstabell med grupptabell och den resulterande SQL kommer att vara ungefär som
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
En annan sak relaterade till ditt sätt att få team för varje grupp. Du kan minimera din kod genom att utesluta createQueryBuilder
del inom loop, när du har definierat teams-egenskapen som ArrayCollection
dvs $this->team = new ArrayCollection();
på varje gruppobjekt får du samlingar av team som är associerade till den specifika gruppen genom att anropa getTeam()
funktion på gruppobjekt liknande koden nedan.
foreach ($groups as $group) {
$teamsingroup = $group->getTeam();
echo "</b>".$group->getGroupname()."</b></br>";
foreach ($teamsingroup as $teamingroup) {
echo $teamingroup->getTeam()."</br>";
}
}