我对数组集合有疑问。
如果我不使用“$ 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())));
}
}
答案 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,
));