Partage
  • Partager sur Facebook
  • Partager sur Twitter

Symfony edit ManyToMany without removing

Conserver les données déjà enregistrées sur une relation ManyToMany

    16 octobre 2020 à 15:58:34

    Bonjour,

    Je développe un site internet en Symfony 5. Je n'ai pas une grosse expérience en développement. Et je me heurte à ce problème.

    J'ai une relation ManyToMany sur des Musiciens et des Instruments avec Une liste déroulante sur les deux côtés. Mais si je modifie mon musicien pour lui ajouter un instrument et que je sélectionne pas ceux qu'il jouait déjà, ceux-ci ne sont pas enregistrés.

    Quelqu'un peut-il m'aiguiller sur une ce que j'ai certainement oublié de faire :

    Le controller de mon musicien :

       /**
         * @Route("/{id}/edit", name="member_edit", methods={"GET","POST"})
         * @param Request $request
         * @param Member $member
         * @return Response
         */
        public function edit(Request $request, Member $member): Response
        {
            $form = $this->createForm(MemberType::class, $member);
            $form->handleRequest($request);
    
            if ($form->isSubmitted() && $form->isValid()) {
                $this->getDoctrine()->getManager()->flush();
    
                return $this->redirectToRoute('member_index');
            }
    
            return $this->render('admin/member/edit.html.twig', [
                'member' => $member,
                'form' => $form->createView(),
            ]);
        }


    La relation musicien enfin plutôt membre avec l'intrument dans l'entité membre :

        /**
         * @ORM\ManyToMany(targetEntity=Instrument::class, inversedBy="members")
         */
        private $instruments;
        /**
         * @return Collection|Instrument[]
         */
        public function getInstruments(): Collection
        {
            return $this->instruments;
        }
    
        public function addInstrument(Instrument $instrument): self
        {
            if (!$this->instruments->contains($instrument)) {
                $this->instruments[] = $instrument;
            }
    
            return $this;
        }
    
        public function removeInstrument(Instrument $instrument): self
        {
            if ($this->instruments->contains($instrument)) {
                $this->instruments->removeElement($instrument);
            }
    
            return $this;
        }

    Et du coté des instruments :

        /**
         * @ORM\ManyToMany(targetEntity=Member::class, mappedBy="instruments")
         */
        private $members;
    
        /**
         * @return Collection|Member[]
         */
        public function getMembers(): Collection
        {
            return $this->members;
        }
    
        public function addMember(Member $member): self
        {
            if (!$this->members->contains($member)) {
                $this->members[] = $member;
                $member->addInstrument($this);
            }
    
            return $this;
        }
    
        public function removeMember(Member $member): self
        {
            if ($this->members->contains($member)) {
                $this->members->removeElement($member);
                $member->removeInstrument($this);
            }
    
            return $this;
        }

    Merci...


    -
    Edité par Natoub 16 octobre 2020 à 16:00:12

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      16 octobre 2020 à 16:37:56

      Il nous manque le MemberType mais le problème vient certainement de by_reference qui est resté à true dans les options du champ mappé à la collection des instruments.

      cf. https://symfony.com/doc/current/reference/forms/types/collection.html#by-reference

      -
      Edité par Anonyme 16 octobre 2020 à 16:38:29

      • Partager sur Facebook
      • Partager sur Twitter

      Symfony edit ManyToMany without removing

      × 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