Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie funktioniert Inner Join bei einer Many-to-Many-Beziehung mit Doctrine und Symfony2

Verwenden von ManyToMany zwischen 2 Entitäten beinhaltet eine dritte Tabelle, die bei dieser Art von Beziehung allgemein als Verbindungstabelle bezeichnet wird>

$teamsingroup = $em->getRepository("AppBundle\Model\Entity\Team")
                    ->createQueryBuilder('o')
                    ->innerJoin('o.group', 't')

Sie treten Team bei Entität mit Group Entität in innerJoin('o.group') Teil o ist der Alias ​​für Teamentität und o.group bezieht sich auf die in Team definierte Eigenschaft als group benannte Entität .

/**
 * @ORM\ManyToMany(targetEntity="Groups", mappedBy="team")
 */
protected $group;

Welches hat ein ManyToMany Die für diese Art von Beziehungsdoktrin definierte Anmerkung verbindet zuerst Ihre Team-Tabelle mit der Junction-Tabelle und verbindet dann Ihre Junction-Tabelle mit der Gruppentabelle, und das resultierende SQL sieht in etwa so aus

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

Eine andere Sache im Zusammenhang mit Ihrer Art, ein Team für jede Gruppe zu erhalten, können Sie Ihren Code minimieren, indem Sie createQueryBuilder ausschließen Teil innerhalb der Schleife, sobald Sie die Teams-Eigenschaft als ArrayCollection definiert haben d.h. $this->team = new ArrayCollection(); für jedes Gruppenobjekt erhalten Sie Sammlungen von Teams, die dieser bestimmten Gruppe zugeordnet sind, indem Sie getTeam() aufrufen Funktion für Gruppenobjekt ähnlich dem folgenden Code.

foreach ($groups as $group) {
    $teamsingroup = $group->getTeam();
    echo "</b>".$group->getGroupname()."</b></br>";
    foreach ($teamsingroup as $teamingroup) {
        echo $teamingroup->getTeam()."</br>";
    }
}