Използване на ManyToMany
между 2 обекта включва трета таблица, обикновено наричана съединителна таблица в този тип релация, когато създавате DQL (доктринна заявка) доктрината автоматично се присъединява към съединителната таблица в зависимост от естеството на релацията, която сте дефинирали като анотация, така че вземайки под внимание вашата заявка
$teamsingroup = $em->getRepository("AppBundle\Model\Entity\Team")
->createQueryBuilder('o')
->innerJoin('o.group', 't')
Вие се присъединявате към Team
обект с Group
обект в innerJoin('o.group')
част o
е псевдонимът на обекта Team и 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
Друго нещо, свързано с вашия начин за получаване на екип за всяка група, можете да минимизирате кода си, като изключите createQueryBuilder
част в рамките на цикъл, след като сте дефинирали свойството на teams като 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>";
}
}