L3 Info : PHP et Applications Web
 
◃  Ch. 11 Some old Stuff (chapitre non maintenu)  ▹
 

Gestion des associations ManyToMany

  • Associations Many to Many voir doctrine
  • Dans ce nouvel exemple, les entités associées aux tables auteur et livre sont nommées Auteur et Livre.
  • La gestion des associations par Doctrine n'est pas symétrique : il y a une Entité qui est prioritaire et qui peut gérer les informations associatives : c'est l'entité dans laquelle les directives @JointTable sont présentes, ici l'entité Auteur et l'attribut livNumArray :
    /**
         * @var \Doctrine\Common\Collections\Collection
         *
         * @ORM\ManyToMany(targetEntity="Livre", inversedBy="aut")
         * @ORM\JoinTable(name="livaut",
         *   joinColumns={
         *     @ORM\JoinColumn(name="aut_id", referencedColumnName="aut_id")
         *   },
         *   inverseJoinColumns={
         *     @ORM\JoinColumn(name="liv_num", referencedColumnName="liv_num")
         *   }
         * )
         */
         private $livNumArray;
  • Modification de l'entité prioritaire ici Auteur::class avec une méthode permettant l'ajout d'un livre
        /**
         * @param Livre $livre
         */
        public function addLivre(Livre $livre) {
            $this->livNumArray->add($livre);
        }
  • Construction du formulaire v1 (liste de sélection)
    $livres = $this->getDoctrine()->getRepository(Livre::class)->findAll();
    
    $dataChoice = array();
    
    foreach ($livres as $livre) {
                $livTitre = $livre->getLivTitre();
                $dataChoice[$livTitre] = $livre->getLivNum();
    }
    
    $form = $this->createFormBuilder()
        ->add('liv_num', ChoiceType::class, array('choices' => $dataChoice))
        ->add('save', SubmitType::class, array('label' => 'Update livre'))
        ->getForm();
  • Construction du formulaire v2 (checkbox)
    $livres = $this->getDoctrine()->getRepository(Livre::class)->findAll();
    
    $form = $this->createFormBuilder()
        ->add('liv_num', EntityType::class, [
                    'class' => Livre::class,
                    'multiple' => false,
                    'expanded' => false,
                    'choice_label' => 'liv_titre',
                ])
        ->add('save', SubmitType::class, array('label' => 'Update livre'))
        ->getForm();
  • Traitement des données du formulaire
    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
        $livre = $this->getDoctrine()
            ->getRepository(Livre::class)
            ->find($form->getData()['liv_num']);
        $auteur->addLivre($livre);
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($livre);
        $entityManager->persist($auteur);
        $entityManager->flush();
        return $this->redirectToRoute('detailAuteur', array('id'=> $autId));
        }
  • Demo