Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony 4.2] Form ManyToOne ne s'enregistre pas

Sujet résolu
    20 mars 2019 à 18:30:51

    Bonjour,

    Je rencontre une problématique que je tente de résoudre depuis plus d'une semaine sans succès, j'ai tenter plusieurs méthode à présent je pense être arriver près du but, mais ça coince encore et je désespère vraiment.

    J'ai une entité 'Evenement', une entité 'Slide', une entité 'Intervenants' :

    Chaque 'Evenement' peut contenir plusieurs 'Slide', chaque 'Slide' peut contenir une entité 'Intervenants'  dans laquel je récupère les profils d'utilisateurs assigner à la 'Slide' courante.

    Auparavent j'avais une ManyToMany qui fonctionner cependant vue que je devais récupérer les profils liées à cet ManyToMany pour afficher plusieurs formulaire depuis le contenu des ManyToMany ça coincer j'ai donc procéder en remplaçant la ManyToMany par des ManyToOne et OneToMany, et là j'obtiens l'érreur :

    Expected value of type "App\Entity\Intervenant\Profil\Profil" for association field "App\Entity\Client\Projet\Intervenants#$intervenants", got "Doctrine\Common\Collections\ArrayCollection" instead.

    Mes sources réduites au maximum : (le code entier étant vraiment très grands j'ai trouver nécessaire par lisibilité de ne montrer que les parties concernés, donc certains use peuvent parraître ne servir à rien c'est normal)

    Mon controlleur :

        /**
         * @Route("/assigner/intervenant/{idEvenement}/{id}", name="gestion_projet_historique_slide_intervenant_edit", methods="GET|POST")
         */
        public function newSlideIntervenant(Request $request, Slide $slide, $id, $idEvenement,  \Swift_Mailer $mailer, AuthorizationCheckerInterface $authChecker): Response
        {
    
            $repo = $this->getDoctrine()->getRepository(Evenement::class);
            $projet = $repo->find($idEvenement);
            $repository = $this->getDoctrine()->getRepository(Slide::class);
            $slide = $repository->find($id);
            $intervenants = new Intervenants();
            $intervenants->setSlide($slide);
    
            $form = $this->createForm(IntervenantType::class, $intervenants);
            $form->handleRequest($request);
    
            if ($form->isSubmitted() && $form->isValid()) {
                $em = $this->getDoctrine()->getManager();
                $em->persist($intervenants);
                $em->flush();
    
                $this->addFlash(
                'notice',
                'Les intervenants ont correctement été ajouter.'
                );
                return $this->redirectToRoute('gestion_projet_historique_slide_voir', ['id' => $idEvenement]);
              }
    
            return $this->render('intervenant/gestion/projet/historique/slide/intervenant.html.twig', [
                'form' => $form->createView(),
                'slide' => $slide,
                'projet' => $projet,
                'idEvenement' => $idEvenement,
            ]);
        }

    Mon Entité Intervenants :

    <?php
    
    namespace App\Entity\Client\Projet;
    
    use App\Entity\Intervenant\Utilisateur;
    use App\Entity\Client\Projet\Intervenants;
    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\Common\Collections\Collection;
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\ORM\Mapping\JoinColumn;
    
    
    /**
     * Intervenants
     *
     * @ORM\Entity
     * @ORM\Entity(repositoryClass="App\Repository\Client\Projet\IntervenantsRepository")
     * @ORM\Table(name="cli_slide_intervenants")
     *
     */
    class Intervenants
    {
        /**
         * @var int
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
    
        /**
         * @ORM\ManyToOne(targetEntity="App\Entity\Client\Projet\Slide", inversedBy="intervenants")
         * @JoinColumn(name="slide_id", referencedColumnName="id", nullable=true, onDelete="Cascade")
         * @ORM\OrderBy({"dateDepart" = "ASC"})
         */
        private $slide;
    
        /**
         * @ORM\ManyToOne(targetEntity="App\Entity\Intervenant\Profil\Profil", inversedBy="projets")
         * @JoinColumn(name="intervenants_id", referencedColumnName="id", nullable=true, onDelete="Cascade")
         * @ORM\OrderBy({"firstname" = "ASC"})
         */
        private $intervenants;
    
    		/**
    		 * @ORM\OneToMany(targetEntity="App\Entity\Intervenant\Profil\Profil", mappedBy="projetsProfil")
         * @ORM\OrderBy({"dateDepart" = "ASC"})
    		 */
    		private $intervenantsProfil;
    
        /**
         * @var array
         *
         * @ORM\Column(name="booker", type="array", nullable=true)
         *
         */
        private $booker;
    
        /**
      	 * @ORM\Column(name="is_active", type="boolean")
      	 */
      	private $isActive;
    
        public function __construct()
       	{
            $this->isActive = true;
            $this->intervenants = new ArrayCollection();
       	}
    
        /**
         * Get id.
         *
         * @return int
         */
        public function getId()
        {
            return $this->id;
        }
    
        public function setSlide(?Slide $slide)
        {
            $this->slide = $slide;
            return $this;
        }
    
        public function getSlide(): ?Slide
        {
            return $this->slide;
        }
    
        public function setIntervenants(?Intervenants $intervenants)
        {
            $this->intervenants = $intervenants;
            return $this;
        }
    
        public function getIntervenants(): ?Intervenants
        {
            return $this->intervenants;
        }
    
        public function addIntervenantsProfil(Intervenants $intervenantsProfil)
    	  {
    	    $this->intervenantsProfil[] = $intervenantsProfil;
    	  }
    
    	  public function removeIntervenantsProfil(Intervenants $intervenantsProfil)
    	  {
    	    $this->intervenantsProfil->removeElement($intervenantsProfil);
    	  }
    
    	  public function getIntervenantsProfil()
    	  {
    	    return $this->intervenantsProfil;
    	  }
    
        /**
    		 * Set booker.
    		 *
    		 * @param array|null $booker
    		 *
    		 * @return Utilisateur
    		 */
    		public function setBooker($booker = null)
    		{
    		    $this->booker = $booker;
    
    		    return $this;
    		}
    
    		/**
    		 * Get booker.
    		 *
    		 * @return array|null
    		 */
    		public function getBooker()
    		{
    		    return $this->booker;
    		}
    
        /*
        * Get isActive
        */
        public function getIsActive()
        {
        	return $this->isActive;
        }
    
        /*
        * Set isActive
        */
        public function setIsActive($isActive)
        {
        	$this->isActive = $isActive;
        	return $this;
        }
    }
    




    Mon Entité Slide :

    <?php
    
    namespace App\Entity\Client\Projet;
    
    use App\Entity\Intervenant\Utilisateur;
    use App\Entity\Client\Projet\Intervenants;
    use App\Entity\Intervenant\Profil\Profil;
    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\Common\Collections\Collection;
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\ORM\Mapping\JoinColumn;
    
    
    /**
     * Slide
     *
     * @ORM\Table(name="cli_slide")
     * @ORM\Entity(repositoryClass="App\Repository\Client\Projet\SlideRepository")
     *
     */
    class Slide
    {
        /**
         * @var int
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
    
        /**
         * @ORM\ManyToOne(targetEntity="App\Entity\Client\Projet\Evenement", inversedBy="slide")
         * @JoinColumn(name="evenement_id", referencedColumnName="id", nullable=true, onDelete="Cascade")
         */
        private $evenement;
    
        /**
      	 * @ORM\Column(name="is_active", type="boolean")
      	 */
      	private $isActive;
    
        /**
         * @ORM\ManyToOne(targetEntity="App\Entity\Client\Projet\Intervenants", inversedBy="slide")
         * @JoinColumn(name="intervenants_id", referencedColumnName="id", nullable=true, onDelete="Cascade")
         * @ORM\OrderBy({"firstname" = "ASC"})
         */
        private $intervenants;
    
        public function __construct()
       	{
            $this->isActive = true;
            $this->intervenants = new ArrayCollection();
       	}
    
        /**
         * Get id.
         *
         * @return int
         */
        public function getId()
        {
            return $this->id;
        }
    
        public function getEvenement(): ?Evenement
        {
            return $this->evenement;
        }
    
        public function setEvenement(?Evenement $evenement): self
        {
            $this->evenement = $evenement;
    
            return $this;
        }
    
        /*
        * Get isActive
        */
        public function getIsActive()
        {
        	return $this->isActive;
        }
    
        /*
        * Set isActive
        */
        public function setIsActive($isActive)
        {
        	$this->isActive = $isActive;
        	return $this;
        }
    
        public function setIntervenants(Intervenants $intervenants)
        {
            $this->intervenants = $intervenants;
            return $this;
        }
    
        public function getIntervenants()
        {
            return $this->intervenants;
        }
    }
    

    Mon Entité Profil :

    <?php
    
    namespace App\Entity\Intervenant\Profil;
    
    use App\Entity\Client\Projet\Slide;
    use App\Entity\Client\Projet\Evenement;
    use App\Entity\Client\Projet\Intervenants;
    use App\Entity\Intervenant\Utilisateur;
    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\Common\Collections\Collection;
    use Doctrine\ORM\Mapping as ORM ;
    use Symfony\Component\Validator\Constraints as Assert;
    use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
    use Doctrine\ORM\Mapping\JoinColumn;
    
    /**
     * @ORM\Table(name="int_profil")
     * @ORM\Entity(repositoryClass="App\Repository\Intervenant\ProfilRepository")
     */
    class Profil
    {
    	/**
    	 * @ORM\Column(type="integer")
    	 * @ORM\Id
    	 * @ORM\GeneratedValue(strategy="AUTO")
    	 */
    	private $id;
    
        /**
         * @ORM\OneToOne(targetEntity="App\Entity\Intervenant\Utilisateur", cascade={"persist"})
         * @JoinColumn(name="utilisateur_id", referencedColumnName="id", nullable=true)
         *
         *
         */
        private $utilisateur;
    
    		/**
    		 * @ORM\OneToMany(targetEntity="App\Entity\Client\Projet\Intervenants", mappedBy="intervenants")
         * @ORM\OrderBy({"dateDepart" = "ASC"})
    		 */
    		private $projets;
    
        /**
         * @ORM\ManyToOne(targetEntity="App\Entity\Client\Projet\Intervenants", inversedBy="intervenantsProfil")
         * @ORM\OrderBy({"firstname" = "ASC"})
         */
        private $projetsProfil;
    
    
        public function __construct()
        {
            $this->projetsProfil = new ArrayCollection();
        }
    
        /*
         * Get id
         */
        public function getId()
        {
            return $this->id;
        }
    
        /**
         * Set utilisateur.
         *
         * @param \App\Entity\Intervenant\Utilisateur|null $utilisateur
         *
         * @return Specialites
         */
        public function setUtilisateur(\App\Entity\Intervenant\Utilisateur $utilisateur = null)
        {
            $this->utilisateur = $utilisateur;
    
            return $this;
        }
    
        /**
         * Get utilisateur.
         *
         * @return \App\Entity\Intervenant\Utilisateur|null
         */
        public function getUtilisateur()
        {
            return $this->utilisateur;
        }
    
    		public function addProjets(Intervenants $projets)
    	  {
    	    $this->projets[] = $projets;
    	  }
    
    	  public function removeProjets(Intervenants $projets)
    	  {
    	    $this->projets->removeElement($projets);
    	  }
    
    	  public function getProjets()
    	  {
    	    return $this->projets;
    	  }
    
        public function setProjetsProfil(Intervenants $projetsProfil)
        {
            $this->projetsProfil = $projetsProfil;
            return $this;
        }
    
        public function getProjetsProfil()
        {
            return $this->projetsProfil;
        }
    }
    

    Mon formulaire :

    <?php
    
    namespace App\Form\Client\Projet;
    
    use App\Entity\Client\Projet\Intervenants;
    use App\Entity\Intervenant\Profil\Profil;
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;
    use Symfony\Bridge\Doctrine\Form\Type\EntityType;
    
    class IntervenantType extends AbstractType
    {
    
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('booker', EntityType::class, array(
                    'class' => Profil::class,
                    'expanded'     => true,
                    'multiple'     => true,
                    'choice_label' => function(Profil $profil) {
                        return $profil->getFirstname() . ' ' . $profil->getLastname() . ' ' . $profil->getPhone(); }
            ))
            ;
    
        }
    
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults([
                'data_class' => Intervenants::class,
            ]);
        }
    }
    



    Est-ce vraiment la bonne méthode pour faire ce que je veut faire, je l'espère, car j'ai déjà utiliser énormément de temps sur cet petite partie du développement.

    J'espère que vous pourrez m'éclairer et vous en remercie d'avance pour avoir pris le temps de me lire.




    -
    Edité par TuxZero 23 mars 2019 à 15:19:48

    • Partager sur Facebook
    • Partager sur Twitter
      21 mars 2019 à 16:19:35

      Salut,

      je ne comprends pas trop l’intérêt de ça:

      /**
           * @ORM\ManyToOne(targetEntity="App\Entity\Intervenant\Profil\Profil", inversedBy="projets")
           * @JoinColumn(name="intervenants_id", referencedColumnName="id", nullable=true, onDelete="Cascade")
           * @ORM\OrderBy({"firstname" = "ASC"})
           */
          private $intervenants;
       
              /**
               * @ORM\OneToMany(targetEntity="App\Entity\Intervenant\Profil\Profil", mappedBy="projetsProfil")
           * @ORM\OrderBy({"dateDepart" = "ASC"})
               */
              private $intervenantsProfil;

      Ça complique beaucoup les relations entre tes entités.

      Peux-tu nous dire clairement les relations que tu souhaites entre tes entités?

      (par exemple:  1 Projet peut contenir plusieurs Slide, 1 Slide appartient à 1 seul Projet ou à plusieurs? etc.. pour toutes tes relations)

      • Partager sur Facebook
      • Partager sur Twitter
        21 mars 2019 à 19:33:53

        Salut,

        Enfait je tente de reproduire ce que fais une ManyToMany de mon entité Intervenant à Profil mais sans la ManyToMany car étant donner que l'ont ne peut pas ajouter d'attribut aux ManyToMany cela me bloque dans ce que je dois faire.

        L'entité Slide ne peut appartenir qu'à un seul projet, et l'entité Intervenant ne peut appartenir qu'à un Slide.

        En résumer :

        L'entité Projet peut contenir plusieurs Slide, mais le Slide ne peut être attribuer qu'à un projet et l'entité Intervenants ne peut être liée qu'à une Slide, mais j'ai besoin que l'entité Intervenant soit liés à l'entité Profil et que l'entité Profil soit liée à l'entité Intervenant.

        -
        Edité par TuxZero 21 mars 2019 à 19:38:41

        • Partager sur Facebook
        • Partager sur Twitter
          22 mars 2019 à 22:08:25

          Up personne n'a une idée svp ?
          • Partager sur Facebook
          • Partager sur Twitter
            23 mars 2019 à 13:11:39

            Salut

            Je ne vois pas ton entité Projet ? Actuellement je vois une entité Profil Sinon 

            <?php
             
            namespace App\Entity\Client\Projet;
             
             
            class Projet
            {
                /**
                 * @ORM\OneToMany(targetEntity="App\Entity\Client\Projet\Slide", mappedBy="project")
                 */
                protected $slides;
            }
            <?php
             
            namespace App\Entity\Client\Projet;
             
             
            class Slide
            {
                /**
                 * @ORM\ManyToOne(targetEntity="App\Entity\Client\Projet\Projet", inversedBy="slides")
                 */
                protected $project;
            
                /**
                 * @ORM\ManyToOne(targetEntity="App\Entity\Client\Projet\Intervenant")
                 */
                protected $intervenant;
            }




            • Partager sur Facebook
            • Partager sur Twitter
              23 mars 2019 à 14:56:44

              Salut,

              Merci pour ta réponse,

              Mea culpa l'entité projet correspond à l'entité Evenement dans mon code elle n'est pas montrer, car cela n'a pas d'utilité de la montrer étant donner que le soucis viens de la relation entre Slide / Intervenants et Profil.

              En supprimant :

                      $this->intervenants = new ArrayCollection();

              de mon constructeur j'ai pu résoudre l'érreur, ce qui est étrange c'est que j'avais à plusieurs reprise déjà essayer cela sans succès et là ça a fonctionner --', je suis entrain de finir de tester du coups et je vous tiens au courant

              -
              Edité par TuxZero 23 mars 2019 à 18:51:40

              • Partager sur Facebook
              • Partager sur Twitter

              [Symfony 4.2] Form ManyToOne ne s'enregistre pas

              × 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