Partage
  • Partager sur Facebook
  • Partager sur Twitter

Symfony : Affecter un ateliers à plusieurs candida

Quels types de relation ?

    15 septembre 2017 à 11:13:08

    Bonjour,

    je voudrais avoir votre avis, avant de faire mon entité Affectation :

    Je veux affecter un atelier à plusieurs candidats (ici l'entité identification)

    J'ai une entité Ateliers (id, nom) et une entité Identification (id, nom, prenom)

    Je voudrais créer une entité Affectation avec ces attributs : Affectation (id, id_atelier, id_identification)

    S'agit t'il d'une relation OneToMany ? comment gérer cela ?

    Merci de votre aide

    • Partager sur Facebook
    • Partager sur Twitter
      16 septembre 2017 à 17:17:52

      Hello,

      Dans ton cas, tu n'as pas besoin de créer une 3e entité pour lier tes 2 autres : une simple relation ManyToMany convient. Cf. https://openclassrooms.com/courses/developpez-votre-site-web-avec-le-framework-symfony/les-relations-entre-entites-avec-doctrine2-1#/id/r-3622661

      Si par contre tu souhaites ajouter des informations sur cette relation (par exemple la date à laquelle il y a eu affectation), alors effectivement il te faut une 3e entité de liaison. Cf. https://openclassrooms.com/courses/developpez-votre-site-web-avec-le-framework-symfony/les-relations-entre-entites-avec-doctrine2-1#/id/r-3622719

      -
      Edité par winzou 16 septembre 2017 à 17:18:15

      • Partager sur Facebook
      • Partager sur Twitter
        19 septembre 2017 à 12:25:42

        Hello winzou,

        Merci pour ta réponse.

        J'ai donc appliquer la solution qui consiste à une simple relation ManyToMany.

        Voici ce que ça donne au niveau de mes entités :

        Entité ateliers

        /**
         * Ateliers
         *
         * @ORM\Table(name="ateliers")
         * @ORM\Entity(repositoryClass="VaeBundle\Repository\AteliersRepository")
         */
        class Ateliers
        {
            /**
             * @var int
             *
             * @ORM\Column(name="id", type="integer")
             * @ORM\Id
             * @ORM\GeneratedValue(strategy="AUTO")
             */
            private $id;
            
        
            
        
            /**
             * @var string
             *
             * @ORM\Column(name="nom", type="string", length=255)
             */
            private $nom;
        
            /**
             * @var string
             *
             * @ORM\Column(name="date", type="datetimetz", length=255)
             */
            private $date;
        
        
            /**
             * @var string
             *
             * @ORM\Column(name="description", type="string", length=255)
             */
            private $description;
        
            /**
             * @var string
             *
             * @ORM\Column(name="quotite", type="string", length=255)
             */
            private $quotite;
        
            /**
             * @var string
             *
             * @ORM\Column(name="lieu", type="string", length=255)
             */
            private $lieu;
            
            /**
             * @var string
             *
             * @ORM\Column(name="adresse", type="string", length=255)
             */
            private $adresse;
        
            /**
             * @var string
             *
             * @ORM\Column(name="url", type="string", length=255)
             */
            private $url;
        
            /**
             * @var string
             *
             * @ORM\Column(name="note", type="string", length=255)
             */
            private $note;
        }


        Entité Identification

        /**
         * Identification
         *
         * @ORM\Table(name="identification")
         * @ORM\Entity(repositoryClass="VaeBundle\Repository\IdentificationRepository")
         * @ORM\HasLifecycleCallbacks
         */
        class Identification
        {
            /**
             * @var int
             *
             * @ORM\Column(name="id", type="integer")
             * @ORM\Id
             * @ORM\GeneratedValue(strategy="AUTO")
             */
            private $id;
            
            
            /**
            * @ORM\ManyToMany(targetEntity="VaeBundle\Entity\Ateliers", cascade={"persist"})
            */
           private $ateliers;
        
          /**
             * @var string
             *
             * @ORM\Column(name="nom", type="string", length=255)
             */
            private $nom;
        
            /**
             * @var string
             *
             * @ORM\Column(name="prenom", type="string", length=255)
             */
            private $prenom;
        
            /**
             * Constructor
             */
            public function __construct()
            {
                $this->ateliers = new \Doctrine\Common\Collections\ArrayCollection();
            }
        
            /**
             * Add atelier
             *
             * @param \VaeBundle\Entity\Ateliers $atelier
             *
             * @return Identification
             */
            public function addAtelier(\VaeBundle\Entity\Ateliers $atelier)
            {
                $this->ateliers[] = $atelier;
        
                return $this;
            }
        
            /**
             * Remove atelier
             *
             * @param \VaeBundle\Entity\Ateliers $atelier
             */
            public function removeAtelier(\VaeBundle\Entity\Ateliers $atelier)
            {
                $this->ateliers->removeElement($atelier);
            }
        
            /**
             * Get ateliers
             *
             * @return \Doctrine\Common\Collections\Collection
             */
            public function getAteliers()
            {
                return $this->ateliers;
            }
        
        }

        et voici mon controller :

            /**
             * @Route("/cas_auth/index/affectations", name="affectations")
             */
            public function affectationsAction(Request $request)
            {     
                $em = $this->getDoctrine()->getManager();
                $candidatFavorable = $em->getRepository('VaeBundle:Ateliers')->candidatFavorable();
                
                //$allAteliers = $em->getRepository('VaeBundle:Ateliers')->allAteliers();
                
        
                    $atelier = new Ateliers();            
                    $formAteliers = $this->createFormBuilder($atelier)
                        ->add('nom',EntityType::class, array('class' => 'VaeBundle:Ateliers', 'choice_label' => 'nom', 'placeholder' => 'Choisissez ...'))
                        ->add('save', SubmitType::class, array('label' => 'Enregistrer'))      
                        ->getForm();
        
                    $formAteliers->handleRequest($request);
        
                    if ($formAteliers->isSubmitted() && $formAteliers->isValid()) 
                    {
                        $atelier = $formAteliers->getData();
                        $em = $this->getDoctrine()->getManager();
                        $em->persist($atelier);
                        $em->flush();
        
                        return $this->redirectToRoute('ateliers');
                    }
                
                
                return $this->render('VaeBundle:Ateliers:affectations.html.twig', array(
                    //'candidatFavorable' => json_encode($candidatFavorable),
                    //'allAteliers' => $allAteliers,
                    'formAteliers' => $formAteliers->createView(),
                ));
            }

        Puisque je veux affecter 1 ou plusieurs candidats à un ateliers en un seul enregistrement, comment je peux le faire ?

        Et comment lui faire comprendre qu'il doit enregistrer dans ma table intermédiaire identification_ateliers (identification_id, ateliers_id) ?

        Je voudrais avoir ma 2ieme liste déroulante pour lister les candidats favorable ($candidatFavorable = $em->getRepository('VaeBundle:Ateliers')->candidatFavorable();)

        Merci de ton aide.


        • Partager sur Facebook
        • Partager sur Twitter

        Symfony : Affecter un ateliers à plusieurs candida

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown