Mysql
 sql >> Database >  >> RDS >> Mysql

In che modo inner join funziona su una relazione molti-a-molti usando Doctrine e Symfony2

Utilizzo di ManyToMany tra 2 entità coinvolge una terza tabella generalmente chiamata tabella di giunzione in questo tipo di relazione quando si costruisce una dottrina DQL (dottrina query) si unisce automaticamente alla tabella di giunzione a seconda della natura della relazione che hai definito come annotazione quindi considerando la tua query

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

Ti stai unendo al Team entità con Group entità in innerJoin('o.group') parte o è l'alias per l'entità Team e o.group si riferisce alla proprietà definita in Team entità denominata come group .

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

Che ha un ManyToMany l'annotazione definita per questo tipo di dottrina di relazione si unisce prima alla tabella del team con la tabella di giunzione e quindi alla tabella di giunzione con la tabella dei gruppi e l'SQL risultante sarà qualcosa di simile

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

Un'altra cosa relativa al tuo modo di ottenere team per ogni gruppo puoi ridurre a icona il tuo codice escludendo createQueryBuilder parte all'interno del ciclo, dopo aver definito la proprietà del team come ArrayCollection cioè $this->team = new ArrayCollection(); su ogni oggetto gruppo otterrai raccolte di squadre associate a quel particolare gruppo chiamando getTeam() funzione sull'oggetto gruppo simile al codice seguente.

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