Pomocí ManyToMany
mezi 2 entitami zahrnuje třetí tabulku obecně nazývanou jako spojovací tabulka v tomto typu vztahu, když vytváříte DQL (doktrínový dotaz), doktrína automaticky spojuje spojovací tabulku v závislosti na povaze vztahu, který jste definovali jako anotaci, takže s ohledem na váš dotaz
$teamsingroup = $em->getRepository("AppBundle\Model\Entity\Team")
->createQueryBuilder('o')
->innerJoin('o.group', 't')
Připojujete se k Team
entity se Group
entity v innerJoin('o.group')
část o
je alias entity Team a o.group
odkazuje na vlastnost definovanou v Team
entita pojmenovaná jako group
.
/**
* @ORM\ManyToMany(targetEntity="Groups", mappedBy="team")
*/
protected $group;
Který má ManyToMany
anotace definovaná pro tento typ relační doktríny spojí vaši týmovou tabulku nejprve se spojovací tabulkou a poté spojí vaši spojovací tabulku s tabulkou skupin a výsledné SQL bude něco jako
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
Další věc týkající se vašeho způsobu získávání týmu pro každou skupinu můžete minimalizovat svůj kód vyloučením createQueryBuilder
část ve smyčce, jakmile definujete týmovou vlastnost jako ArrayCollection
tj. $this->team = new ArrayCollection();
u každého skupinového objektu získáte kolekce týmů přidružených k této konkrétní skupině voláním getTeam()
funkce na skupinovém objektu podobná níže uvedenému kódu.
foreach ($groups as $group) {
$teamsingroup = $group->getTeam();
echo "</b>".$group->getGroupname()."</b></br>";
foreach ($teamsingroup as $teamingroup) {
echo $teamingroup->getTeam()."</br>";
}
}