Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment la jointure interne fonctionne-t-elle sur une relation plusieurs-à-plusieurs en utilisant Doctrine et Symfony2

Utilisation de ManyToMany entre 2 entités implique une troisième table généralement appelée table de jonction dans ce type de relation lorsque vous construisez une doctrine DQL (requête de doctrine) rejoint automatiquement la table de jonction en fonction de la nature de la relation que vous avez définie comme annotation donc en tenant compte de votre requête

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

Vous rejoignez Team entité avec Group entité dans innerJoin('o.group') partie o est l'alias pour l'entité Team et o.group fait référence à la propriété définie dans Team entité nommée group .

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

Qui a un ManyToMany l'annotation définie pour ce type de doctrine de relation rejoint d'abord votre table d'équipe avec la table de jonction, puis joint votre table de jonction avec la table des groupes et le SQL résultant sera quelque chose comme

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

Une autre chose liée à votre façon d'obtenir une équipe pour chaque groupe, vous pouvez minimiser votre code en excluant createQueryBuilder partie dans la boucle, une fois que vous avez défini la propriété teams comme ArrayCollection c'est-à-dire $this->team = new ArrayCollection(); sur chaque objet de groupe, vous obtiendrez des collections d'équipes associées à ce groupe particulier en appelant getTeam() fonction sur l'objet de groupe similaire au code ci-dessous.

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