【问题标题】:Symfony 2 - Delete item from oneToMany relationship in form collectionSymfony 2 - 从表单集合中的 oneToMany 关系中删除项目
【发布时间】:2014-07-25 15:48:16
【问题描述】:

我正在尝试删除表单中的一个项目,但没有任何反应(甚至没有错误...但我可以毫无问题地进行编辑!)

我有一个嵌入了 3 个级别的表单集合(这是关于我的网站的法律声明分为子级别)

这是我的实体:

OneToMany 中名为“MentionLegaleNv1”的第一级

class MentionLegaleNv1 {

    /**
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(name="titre", type="string", length=50, nullable=false)
     */
    private $titre;

    /**
     * @ORM\OneToMany(targetEntity="MentionLegaleNv2", mappedBy="MentionsLegalesNv1", cascade={"persist", "remove"})
     */
    private $MentionsLegalesNv2;

    /**
     * Constructor
     */
    public function __construct() {
        $this->MentionsLegalesNv2 = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId() {
        return $this->id;
    }

    /**
     * Set titre
     *
     * @param string $titre
     * @return MentionLegaleNv1
     */
    public function setTitre($titre) {
        $this->titre = $titre;

        return $this;
    }

    /**
     * Get titre
     *
     * @return string 
     */
    public function getTitre() {
        return $this->titre;
    }

    /**
     * Add MentionsLegalesNv2
     *
     * @param \Video2Learn\BddBundle\Entity\MentionLegaleNv2 $mentionsLegalesNv2
     * @return MentionLegaleNv1
     */
    public function addMentionsLegalesNv2(\Video2Learn\BddBundle\Entity\MentionLegaleNv2 $mentionsLegalesNv2) {
        $mentionsLegalesNv2->setMentionLegaleNv1($this);
        $this->MentionsLegalesNv2[] = $mentionsLegalesNv2;

        return $this;
    }

    /**
     * Remove MentionsLegalesNv2
     *
     * @param \Video2Learn\BddBundle\Entity\MentionLegaleNv2 $mentionsLegalesNv2
     */
    public function removeMentionsLegalesNv2(\Video2Learn\BddBundle\Entity\MentionLegaleNv2 $mentionsLegalesNv2) {
        $this->MentionsLegalesNv2->removeElement($mentionsLegalesNv2);
    }

    /**
     * Get MentionsLegalesNv2
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getMentionsLegalesNv2() {
        return $this->MentionsLegalesNv2;
    }

ManyToOne 和 OneToMany 中第二个名为“MentionLegaleNv2”

class MentionLegaleNv2 {

    /**
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(name="titre", type="string", length=50, nullable=false)
     */
    private $titre;

    /**
     * @ORM\OneToMany(targetEntity="MentionLegaleNv3", mappedBy="MentionsLegalesNv2", cascade={"persist", "remove"})
     */
    private $MentionsLegalesNv3;

    /**
     * @ORM\ManyToOne(targetEntity="MentionLegaleNv1", inversedBy="MentionsLegalesNv2")
     */
    private $MentionsLegalesNv1;

    /**
     * Constructor
     */
    public function __construct() {
        $this->MentionsLegalesNv3 = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId() {
        return $this->id;
    }

    /**
     * Set titre
     *
     * @param string $titre
     * @return MentionLegaleNv2
     */
    public function setTitre($titre) {
        $this->titre = $titre;

        return $this;
    }

    /**
     * Get titre
     *
     * @return string 
     */
    public function getTitre() {
        return $this->titre;
    }

    /**
     * Add MentionsLegalesNv3
     *
     * @param \Video2Learn\BddBundle\Entity\MentionLegaleNv3 $mentionsLegalesNv3
     * @return MentionLegaleNv2
     */
    public function addMentionsLegalesNv3(\Video2Learn\BddBundle\Entity\MentionLegaleNv3 $mentionsLegalesNv3) {
        $mentionsLegalesNv3->setMentionLegaleNv2($this);
        $this->MentionsLegalesNv3[] = $mentionsLegalesNv3;

        return $this;
    }

    /**
     * Remove MentionsLegalesNv3
     *
     * @param \Video2Learn\BddBundle\Entity\MentionLegaleNv3 $mentionsLegalesNv3
     */
    public function removeMentionsLegalesNv3(\Video2Learn\BddBundle\Entity\MentionLegaleNv3 $mentionsLegalesNv3) {
        $this->MentionsLegalesNv3->removeElement($mentionsLegalesNv3);
    }

    /**
     * Get MentionsLegalesNv3
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getMentionsLegalesNv3() {
        return $this->MentionsLegalesNv3;
    }

    /**
     * Set MentionsLegalesNv1
     *
     * @param \Video2Learn\BddBundle\Entity\MentionLegaleNv1 $mentionsLegalesNv1
     * @return MentionLegaleNv2
     */
    public function setMentionsLegalesNv1(\Video2Learn\BddBundle\Entity\MentionLegaleNv1 $mentionsLegalesNv1 = null) {
        $this->MentionsLegalesNv1 = $mentionsLegalesNv1;

        return $this;
    }

    /**
     * Get MentionsLegalesNv1
     *
     * @return \Video2Learn\BddBundle\Entity\MentionLegaleNv1 
     */
    public function getMentionsLegalesNv1() {
        return $this->MentionsLegalesNv1;
    }

ManyToOne 中最后一个名为“MentionLegaleNv3”的关卡

class MentionLegaleNv3 {

    /**
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(name="titre", type="string", length=50, nullable=false)
     */
    private $titre;

    /**
     * @ORM\Column(name="description", type="string", length=500, nullable=false)
     */
    private $description;

    /**
     * @ORM\Column(name="removeTuto", type="boolean", nullable=false)
     */
    private $removeTuto;

    /**
     * @ORM\ManyToOne(targetEntity="MentionLegaleNv2", inversedBy="MentionsLegalesNv3")
     * @ORM\JoinColumn(referencedColumnName="id", nullable=false)
     */
    private $MentionsLegalesNv2;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set titre
     *
     * @param string $titre
     * @return MentionLegaleNv3
     */
    public function setTitre($titre)
    {
        $this->titre = $titre;

        return $this;
    }

    /**
     * Get titre
     *
     * @return string 
     */
    public function getTitre()
    {
        return $this->titre;
    }

    /**
     * Set description
     *
     * @param string $description
     * @return MentionLegaleNv3
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Set removeTuto
     *
     * @param boolean $removeTuto
     * @return MentionLegaleNv3
     */
    public function setRemoveTuto($removeTuto)
    {
        $this->removeTuto = $removeTuto;

        return $this;
    }

    /**
     * Get removeTuto
     *
     * @return boolean 
     */
    public function getRemoveTuto()
    {
        return $this->removeTuto;
    }

    /**
     * Set MentionsLegalesNv2
     *
     * @param \Video2Learn\BddBundle\Entity\MentionLegaleNv2 $mentionsLegalesNv2
     * @return MentionLegaleNv3
     */
    public function setMentionsLegalesNv2(\Video2Learn\BddBundle\Entity\MentionLegaleNv2 $mentionsLegalesNv2)
    {
        $this->MentionsLegalesNv2 = $mentionsLegalesNv2;

        return $this;
    }

    /**
     * Get MentionsLegalesNv2
     *
     * @return \Video2Learn\BddBundle\Entity\MentionLegaleNv2 
     */
    public function getMentionsLegalesNv2()
    {
        return $this->MentionsLegalesNv2;
    }

这是 FormType :

MentionsLegalesNv1Type:

class MentionLegaleNv1Type extends AbstractType {

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
                ->add('MentionsLegalesNv2', 'collection', array(
                    'type' => new MentionLegaleNv2Type(),
                    'prototype' => true,
                    'by_reference' => false,
                    'allow_add' => true,
                    'allow_delete' => true,
                    'error_bubbling' => false,
                    'label' => false,
                    'cascade_validation' => true,
                    'options' => array(
                        'label' => false,
                    ),
                    'attr' => array(
                        'class' => 'MentionsLegalesNv2 list-unstyled',
                    )
                ))
                ->add('Valider', 'submit', array(
                    'attr' => array(
                        'class' => 'suivant btn btn-success',
                        'formnovalidate' => 'formnovalidate',
                    )
                ))
        ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'Video2Learn\BddBundle\Entity\MentionLegaleNv1',
            'cascade_validation' => true,
        ));
    }

    /**
     * @return string
     */
    public function getName() {
        return 'video2learn_administrationbundle_mentionlegalenv1';
    }

}

MentionsLegalesNv2Type:

class MentionLegaleNv2Type extends AbstractType {

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
                ->add('titre', 'text', array(
                    'required' => true,
                    'label' => false,
                    'attr' => array(
                        'placeholder' => 'Mention Légales NV1 n°#',
                        'class' => 'form-control',
                        'title' => 'Titre de la Mention Legale NV1 n°#'
                    )
                ))
                ->add('MentionsLegalesNv3', 'collection', array(
                    'type' => new MentionLegaleNv3Type(),
                    'prototype' => true,
                    'by_reference' => false,
                    'allow_add' => true,
                    'cascade_validation' => true,
                    'allow_delete' => true,
                    'error_bubbling' => false,
                    'label' => false,
                    'options' => array(
                        'label' => false // sert à supprimer les index
                    ),
                    'attr' => array(
                        'class' => 'MentionsLegalesNv3 list-unstyled',
                    )
                ))
        ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'Video2Learn\BddBundle\Entity\MentionLegaleNv2',
            'cascade_validation' => true,
        ));
    }

    /**
     * @return string
     */
    public function getName() {
        return 'video2learn_administrationbundle_mentionlegalenv2';
    }

}

MentionsLegalesNv3Type :

class MentionLegaleNv3Type extends AbstractType {

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
                ->add('titre', 'text', array(
                    'required' => true,
                    'label' => 'Titre Paragraphe',

                ))
                ->add('description','textarea', array(
                    'required' => true,
                    'label' => 'Description Paragraphe',

                ))
                ->add('removeTuto')
        ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'Video2Learn\BddBundle\Entity\MentionLegaleNv3',
            'cascade_validation' => true,
        ));
    }

    /**
     * @return string
     */
    public function getName() {
        return 'video2learn_administrationbundle_mentionlegalenv3';
    }

}

还有我的控制器:

class MentionsLegalesController extends Controller {

    public function mentionLegalesAction(Request $request) {

        $em = $this->getDoctrine()->getManager();

        $ML = $em->getRepository('Video2LearnBddBundle:MentionLegaleNv0')->findOneById(1);

        if ($request->getMethod() == 'GET') {

                $form = $this->createForm(new MentionLegaleNv0Type(), $ML);
        }

        if ($request->isMethod('POST')) {
            $form = $this->createForm(new MentionLegaleNv0Type(), $ML);
            $form->handleRequest($request);

            if ($form->isValid()) {
                $ML = $form->getData();
                $em->persist($ML);
                $em->flush();
                return $this->redirect($this->generateUrl('administration_mentions_legales'));
            }
        }

        return $this->render('Video2LearnAdministrationBundle:Pages:mentions_legales.html.twig', array(
                    'form' => $form->createView(),

        ));
    }

}

我在 Symfony 的 CookBook (http://symfony.com/doc/current/cookbook/form/form_collections.html) 中发现了这一点,我尝试过但没有成功...

class MentionsLegalesController extends Controller {

    public function mentionLegalesAction(Request $request) {

        $em = $this->getDoctrine()->getManager();

        $ML = $em->getRepository('Video2LearnBddBundle:MentionLegaleNv1')->findOneById(1);

        foreach ($ML->getMentionsLegalesNv2() as $tag) {
            $originalTags->add($tag);
        }
        if ($request->getMethod() == 'GET') {
            $form = $this->createForm(new MentionLegaleNv1Type(), $ML);
        }

        if ($request->isMethod('POST')) {
            $form = $this->createForm(new MentionLegaleNv1Type(), $ML);
            $form->handleRequest($request);

            if ($form->isValid()) {
                foreach ($originalTags as $tag) {
                    if ($ML->getMentionsLegalesNv2()->contains($tag) == false) {
                        $em->persist($tag);
                    }
                }

                $em->persist($ML);
                $em->flush();

                return $this->redirect($this->generateUrl('administration_mentions_legales'));
            }
        }

        return $this->render('Video2LearnAdministrationBundle:Pages:mentions_legales.html.twig', array(
                    'form' => $form->createView(),
        ));
    }

}

如何删除 MentionLegaleNv2 或 MentionLegaleNv3 中的项目??

感谢您的帮助!

【问题讨论】:

    标签: php forms symfony collections doctrine-orm


    【解决方案1】:

    您的删除方法应该像您的添加方法一样自动更新连接的对象..

    /**
     * Remove MentionsLegalesNv2
     *
     * @param \Video2Learn\BddBundle\Entity\MentionLegaleNv2 $mentionsLegalesNv2
     */
    public function removeMentionsLegalesNv2(MentionLegaleNv2 $mentionsLegalesNv2) {
        $this->MentionsLegalesNv2->removeElement($mentionsLegalesNv2);
        $mentionsLegalesNv2->setMentionLegaleNv1(null);
    }
    

    【讨论】:

    • 您好!感谢您的帮助...我尝试了您的解决方案,但出现此错误消息:“尝试在 /Users/thomasmelcer/Sites/Video2Learn.fr/src 中的类“Video2Learn\BddBundle\Entity\MentionLegaleNv2”上调用方法“setMentionLegaleNv1” /Video2Learn/BddBundle/Entity/MentionLegalesNv1.php 第 89 行。您的意思是调用:“addMentionsLegalesNv3”、“getMentionsLegalesNv1”、“getMentionsLegalesNv3”、“setMentionsLegalesNv1”吗?”
    • 哦,没关系......这是你写的,但用 ('s') 像这样“$mentionsLegalesNv2->setMentionSLegaleSNv1(null);”所以该解决方案有效但是,我想在数据库中删除,而不仅仅是将其设置为 NULL,因为它始终存在于数据库中......
    【解决方案2】:

    我是通过其他方式...

    我做到了:

    if ($form->isValid()) {
    
                // supprime la relation entre le tag et la « Task »
                foreach ($originalMentionsLegalesNv1 as $mlnv2) {
                    if ($MentionsLegalesNv1->getMentionsLegalesNv2()->contains($mlnv2) == false) {
    
                        $em->remove($mlnv2);
                    }
                }
    
                $em->persist($MentionsLegalesNv1);
                $em->flush();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 2012-01-05
      相关资源
      最近更新 更多