ManyToMany
gebruiken tussen 2 entiteiten omvat een derde tabel die over het algemeen wordt genoemd als een verbindingstabel in dit type relatie wanneer u een DQL-leer (doctrinequery) bouwt, voegt zich automatisch bij de verbindingstabel, afhankelijk van de aard van de relatie die u als annotatie hebt gedefinieerd, dus rekening houdend met uw vraag
$teamsingroup = $em->getRepository("AppBundle\Model\Entity\Team")
->createQueryBuilder('o')
->innerJoin('o.group', 't')
Je wordt lid van Team
entiteit met Group
entiteit in innerJoin('o.group')
deel o
is de alias voor Team-entiteit en o.group
verwijst naar eigenschap gedefinieerd in Team
entiteit met de naam group
.
/**
* @ORM\ManyToMany(targetEntity="Groups", mappedBy="team")
*/
protected $group;
Die een ManyToMany
. heeft annotatie die is gedefinieerd voor dit type relatiedoctrine voegt zich eerst bij uw teamtabel met de verbindingstabel en voegt vervolgens uw verbindingstabel samen met de groepstabel en de resulterende SQL zal zoiets zijn als
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
Een ander ding heeft betrekking op uw manier om voor elke groep een team te krijgen. U kunt uw code minimaliseren door createQueryBuilder
uit te sluiten onderdeel binnen lus, zodra u de teameigenschap hebt gedefinieerd als ArrayCollection
d.w.z. $this->team = new ArrayCollection();
op elk groepsobject krijgt u verzamelingen van teams die aan die specifieke groep zijn gekoppeld door getTeam()
aan te roepen functie op groepsobject vergelijkbaar met onderstaande code.
foreach ($groups as $group) {
$teamsingroup = $group->getTeam();
echo "</b>".$group->getGroupname()."</b></br>";
foreach ($teamsingroup as $teamingroup) {
echo $teamingroup->getTeam()."</br>";
}
}