0

配列コレクションに問題があります。

「$livraison->setChoix($livraison->getChoix());」を使用しない場合 有効なフォームでは、アイテムは関連して保存されません。これにより、コレクション内のアイテムは保存時に重複します。

「Livraison」と「LivraisonChoix」の2つのエンティティがあります

Livraison は LivraisonChoix と OneToMany の関係にあります LivraisonChoix は Livraison と ManyToOne の関係にあります

これがリヴレゾンです。

...
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 に答える