sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo funciona la unión interna en una relación de muchos a muchos usando Doctrine y Symfony2?

Usando ManyToMany entre 2 entidades involucra una tercera tabla generalmente llamada tabla de unión en este tipo de relación cuando crea una DQL (consulta de doctrina) la doctrina automáticamente une la tabla de unión dependiendo de la naturaleza de la relación que haya definido como anotación, por lo que considere su consulta

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

Te estás uniendo al Team entidad con Group entidad en innerJoin('o.group') parte o es el alias de la entidad Equipo y o.group se refiere a la propiedad definida en Team entidad nombrada como group .

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

Que tiene un ManyToMany la anotación definida para este tipo de doctrina de relación une la tabla de su equipo primero con la tabla de unión y luego une su tabla de unión con la tabla de grupos y el SQL resultante será algo así 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

Otra cosa relacionada con su forma de obtener un equipo para cada grupo, puede minimizar su código excluyendo createQueryBuilder parte dentro del ciclo, una vez que haya definido la propiedad de los equipos como ArrayCollection es decir, $this->team = new ArrayCollection(); en cada objeto de grupo obtendrá colecciones de equipos asociados a ese grupo en particular llamando a getTeam() función en el objeto de grupo similar al siguiente código.

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