Symfony2 Doctrine2阵列集合OneToMany不添加项目

时间:2013-06-21 14:38:50

标签: symfony doctrine-orm one-to-many relation arraycollection

我对数组集合有疑问。

如果我不使用“$ livraison-> setChoix($ livraison-> getChoix());”在表格有效的情况下,该项目不会保存。 这样,集合中的项目在任何保存中都是重复的。

我有2个实体,“Livraison”和“LivraisonChoix”

Livraison与OneToMany与LivraisonChoix有关 LivraisonChoix与Livraison的ManyToOne关系

这是Livraison:

...
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

class Livraison
{

...

    /**
     * @ORM\OneToMany(targetEntity="\YOU\CommercantBundle\Entity\LivraisonChoix", mappedBy="livraison", cascade={"all"})
     **/
    private $choix;

    public function __construct()
    {
        $this->choix = new ArrayCollection();
    }


    public function addChoix(\YOU\CommercantBundle\Entity\LivraisonChoix $choix)
    {
        $choix->setLivraison($this);
        $this->choix[] = $choix;
    }

    public function setChoix($choix)
    {
        foreach($choix as $choi){
            $this->addChoix($choi);
        }
    }

    public function removeChoix($choix)
    {
        $this->choix->removeElement($choix);
    }

    public function getChoix()
    {
        return $this->choix;
    }

...

这是LivraisonChoix:

use Doctrine\ORM\Mapping as ORM;

class LivraisonChoix
{

...

    /**
     * @ORM\ManyToOne(targetEntity="YOU\CommercantBundle\Entity\Livraison", inversedBy="choix")
     **/
    private $livraison;

...


    public function setLivraison($livraison)
    {
        $this->livraison = $livraison;

        return $this;
    }

    public function getLivraison()
    {
        return $this->livraison;
    }

...

这是表单构建器:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name')
        ->add('choix','collection',array(
                        'type'=>new LivraisonChoixType(),
                        'allow_add' => true,
                        'allow_delete' => true,
        ))
    ;
}

这是控制器:

        $livraison = new Livraison();

        $form = $this->createForm(new LivraisonType(), $livraison);

        $request = $this->get('request');
        if ($request->getMethod() == 'POST') {
            $form->bind($request);

            if ($form->isValid()) {

                $livraison->setAccount($customer);
                $livraison->setChoix($livraison->getChoix());
                $em->persist($livraison);
                $em->flush();

                return $this->redirect($this->generateUrl('you_commercant_livraison_editer',array('id'=>$livraison->getId())));

            }
        }

1 个答案:

答案 0 :(得分:0)

你忘记了一件重要的事情,在提交表格后获得新的“livraison”($form->getData()):

if ($form->isValid()) {

    $livraison = $form->getData(); // You forgot to get the new / edited "livraison"

    $livraison->setAccount($customer);
    $em->persist($livraison);
    $em->flush();

    return $this->redirect($this->generateUrl('you_commercant_livraison_editer',array('id'=>$livraison->getId())));
}

修改

我认为你应该在表单字段中添加'by_reference'设置为false,这将调用addChoix()方法!检查此cookbook(在本部分的末尾)。这里by_reference的细节。

$builder->add('choix', 'collection', array(
    // ...
    'by_reference' => false,
));