Korzystanie z ManyToMany
między 2 jednostkami obejmuje trzecią tabelę ogólnie nazywaną tabelą połączeń w tego typu relacji, gdy budujesz doktrynę DQL (zapytanie doktrynalne) automatycznie łączy tabelę połączeń w zależności od natury relacji, którą zdefiniowałeś jako adnotację, więc biorąc pod uwagę twoje zapytanie
$teamsingroup = $em->getRepository("AppBundle\Model\Entity\Team")
->createQueryBuilder('o')
->innerJoin('o.group', 't')
Dołączasz do Team
encja z Group
podmiot w innerJoin('o.group')
część o
jest aliasem encji Team i o.group
odnosi się do właściwości zdefiniowanej w Team
jednostka nazwana jako group
.
/**
* @ORM\ManyToMany(targetEntity="Groups", mappedBy="team")
*/
protected $group;
Który ma ManyToMany
adnotacja zdefiniowana dla tego typu doktryny relacji łączy najpierw tabelę zespołu z tabelą skrzyżowań, a następnie łączy tabelę skrzyżowań z tabelą grup, a wynikowy kod SQL będzie wyglądał następująco
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
Kolejną rzeczą związaną z twoim sposobem na pozyskanie zespołu dla każdej grupy możesz zminimalizować swój kod, wyłączając createQueryBuilder
część w pętli, po zdefiniowaniu właściwości zespołów jako ArrayCollection
tj. $this->team = new ArrayCollection();
na każdym obiekcie grupy otrzymasz kolekcje zespołów powiązanych z tą konkretną grupą, wywołując getTeam()
funkcja na obiekcie grupy podobna do poniższego kodu.
foreach ($groups as $group) {
$teamsingroup = $group->getTeam();
echo "</b>".$group->getGroupname()."</b></br>";
foreach ($teamsingroup as $teamingroup) {
echo $teamingroup->getTeam()."</br>";
}
}