Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como a junção interna funciona em um relacionamento muitos para muitos usando Doctrine e Symfony2


Usando ManyToMany entre 2 entidades envolve uma terceira tabela geralmente chamada de tabela de junção neste tipo de relação quando você constrói uma doutrina DQL (doctrine query) a doutrina junta automaticamente a tabela de junção dependendo da natureza da relação que você definiu como anotação considerando sua consulta
$teamsingroup = $em->getRepository("AppBundle\Model\Entity\Team")
                    ->createQueryBuilder('o')
                    ->innerJoin('o.group', 't')

Você está participando da Team entidade com Group entidade em innerJoin('o.group') parte o é o alias para a entidade Team e o.group refere-se à propriedade definida em Team entidade nomeada como group .
/**
 * @ORM\ManyToMany(targetEntity="Groups", mappedBy="team")
 */
protected $group;

Que tem um ManyToMany anotação definida para este tipo de relação doutrina junta sua tabela de equipe primeiro com a tabela de junção e depois junta sua tabela de junção com a tabela de grupos e o SQL resultante será algo como
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

Outra coisa relacionada à sua maneira de obter equipe para cada grupo, você pode minimizar seu código excluindo createQueryBuilder parte dentro do loop, depois de definir a propriedade de equipes como ArrayCollection ou seja, $this->team = new ArrayCollection(); em cada objeto de grupo, você obterá coleções de equipes associadas a esse grupo específico chamando getTeam() função no objeto de grupo semelhante ao código abaixo.
foreach ($groups as $group) {
    $teamsingroup = $group->getTeam();
    echo "</b>".$group->getGroupname()."</b></br>";
    foreach ($teamsingroup as $teamingroup) {
        echo $teamingroup->getTeam()."</br>";
    }
}