0

我对数组集合有疑问。

如果我不使用“$livraison->setChoix($livraison->getChoix());” 在有效的形式中,该项目不保存相关。有了这个,集合中的项目在任何保存中都是重复的。

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

Livraison 与 OneToMany 与 LivraisonChoix 有关 LivraisonChoix 与 ManyToOne 与 Livraison 有关

这是 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())));

            }
        }
4

1 回答 1

0

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

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() 方法!检查这本食谱(在本部分的末尾)。by_reference的细节在这里。

$builder->add('choix', 'collection', array(
    // ...
    'by_reference' => false,
));
于 2013-06-21T14:50:00.433 回答