Partage
  • Partager sur Facebook
  • Partager sur Twitter

Symfony remove entity

Sujet résolu
    24 janvier 2017 à 11:17:26

    Bonjour,

    Je remercie tout le monde par avance pour votre aide.

    J'essaie de supprimer un enregistrement dans ma base de données avec doctrine, mais je rencontre une erreur.
    Ma classe table intermédiaire entre Channel et fos_user : Userchannel

    	/**
    	* @ORM\Id
    	* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Channel", inversedBy="userchannels", cascade={"persist"})
    	*/
    	private $channel;
    	/**
    	* @ORM\Id
    	* @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="userchannels", cascade={"persist"})
    	*/
    	private $user;

    Mon controler qui doit supprimer mon enregistrement :

    	/**
    	* @Route("/remove/{id}/", name="_remove")
    	*/
    	public function removeAction(Request $request, $id)
    	{
    		$repository = $this->getDoctrine()->getManager()->getRepository('AppBundle:Channel');
    		$channel = $repository->findOneBy(array('id' => $id));
    		
    		$user = $this->getUser();
    
    		$userchannel = new Userchannel();
    		$userchannel->setChannel($channel);
    		$userchannel->setUser($user);
    
    		
    		$em = $this->getDoctrine()->getManager();
    		$em->remove($userchannel);
    		$em->flush();
    
    		return $this->redirect($this->generateUrl('member_channel'));
    	}

    Mon erreur lorsque j'essaie de supprimer :


    Detached entity AppBundle\Entity\Userchannel@000000002530fbfd000000006693b026 cannot be removed
    500 Internal Server Error - ORMInvalidArgumentException

    in vendor/doctrine/orm/lib/Doctrine/ORM/ORMInvalidArgumentException.php at line 158

    Merci et à bientot

    -
    Edité par cretthie 24 janvier 2017 à 11:29:37

    • Partager sur Facebook
    • Partager sur Twitter
      24 janvier 2017 à 11:41:48

      Eh bien, deux solutions:

      - Soit ajoutes un "Cascade remove"

      - Soit tu récupères tout tes $userChannel liés à ce channel et tu les remove.

      Ce que tu fais est très étrange, tu crées un nouveau userChannel, qui n'est donc en rien lié à ta base de données pour le supprimer ensuite (alors qu'il n'est déjà pas lié!!!).

      • Partager sur Facebook
      • Partager sur Twitter
        24 janvier 2017 à 11:49:50

        Hello,

        Je te remercie pour ta réponse. :)

        Pourquoi mon userchannel n'est pas lié à ma base de données ?

        Je vais essayer et je te redis.

        Encore merci.

        +++

        • Partager sur Facebook
        • Partager sur Twitter
          24 janvier 2017 à 11:54:29

          Car tu en crées un nouveau (le petit mot clé "new" là) et tu ne le récupères pas de ta base de données.

          /**
          * @Route("/remove/{id}/", name="_remove")
          */
          public function removeAction(Request $request, $id)
          {
              $repository = $this->getDoctrine()->getManager()->getRepository('AppBundle:Channel');
              $channel = $repository->findOneBy(array('id' => $id));
               
              $em = $this->getDoctrine()->getManager();
              foreach($channel->getUserChannels() as $userChannel) {
                $em->remove($userChannel);
              }
           
              $em->remove($channel);
              $em->flush();
           
              return $this->redirect($this->generateUrl('member_channel'));
          }

          D'ailleurs, pourquoi avoir crée la classe UserChannel? Tu devais ajouter un élément dans cette classe?

          Pourquoi pas une relation ManyToMany dans tes objets Channel/User ?

          -
          Edité par Whouki 24 janvier 2017 à 11:55:25

          • Partager sur Facebook
          • Partager sur Twitter
            24 janvier 2017 à 11:59:06

            Voila, merci pour ton aide, en effet, j'ai compris pourquoi mon entité n'était pas liée.
            Voici donc le résultat pour les prochains :

            		$user = $this->getUser();
            
            		$repository = $this->getDoctrine()->getManager()->getRepository('AppBundle:Userchannel');
            		$userchannel = $repository->findOneBy(array('channel' => $id, 'user' => $user));
            		
            		$em = $this->getDoctrine()->getManager();
            		$em->remove($userchannel);
            		$em->flush();
            
            		return $this->redirect($this->generateUrl('member_flux'));



            • Partager sur Facebook
            • Partager sur Twitter
              24 janvier 2017 à 13:36:14

              Tu ne peux avoir qu'un seul lien entre tes channel et user?
              • Partager sur Facebook
              • Partager sur Twitter

              Symfony remove entity

              × 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