我有一个实体" produit"有这种关系:
/**
* @var \stdClass
*
* @ORM\ManyToMany(targetEntity="ListeBundle\Entity\GarDegatEaux", cascade={"persist"})
* @ORM\JoinTable(name="produit_garDegatEaux",
* joinColumns={@ORM\JoinColumn(name="produit_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="garDegatEaux_id", referencedColumnName="id", unique=false)})
*/
private $garDegatEaux;
如下所示的表单类型:
->add('garDegatEaux', CollectionType::class, array('entry_type' => GarDegatEauxType::class,
'allow_add' => true,
'allow_delete' => true,
//'by_reference' => false,
'prototype' => true,
'label' => 'Coefficients dégât des eaux',
'entry_options' => array('label' => 'Coefficients'),
'attr' => array('class' => 'collection')
))
当引用设置为false时,我有这个错误:
该物业" garDegatEaux"也没有其中一种方法" addGarDegatEau()" /" removeGarDegatEau()"," setGarDegatEaux()"," garDegatEaux()&# 34;," __ set()"或" __ call()"在课堂上存在并拥有公共访问权限#DevisBundle \ Entity \ Produit"。
当然在我的实体addGarDegatEau()" /" removeGarDegatEau()"并得到..存在并有公共访问。我还有我的构造函数:
$this->garDegatEaux = new \Doctrine\Common\Collections\ArrayCollection();
当" by_reference"设置为true,没有错误,但没有为集合提交任何内容。当我在持久化之前转储表单时,ArrayCollection中没有任何内容。
当" by_reference"注释没有错误,但ArrayCollection也没有任何内容。
我的控制器:
public function creerProduitAction(Request $request) {
$produit = new Produit;
$formProduit = $this->createForm(ProduitType::class, $produit);
$formProduit->handleRequest($request);
if ($formProduit->isValid() && $formProduit->isSubmitted()) {
$em = $this->getDoctrine()->getManager();
$em->persist($produit);
$em->flush();
}
return $this->render('AdminBundle:Produit:creerProduit.html.twig', array(
'formProduit' => $formProduit->createView()
));
}
我使用了symfony 2.7的集合,这个过程很有效。我使用symfony 2.8 atm。我不明白为什么收藏不会持续存在。
答案 0 :(得分:0)
首先,正如Symfony's Docs所说:
类似地,如果您正在使用CollectionType字段,其中您的基础集合数据是一个对象(如与Doctrine的ArrayCollection一样),那么如果您需要加法器和移除器,则必须将by_reference设置为false(例如addAuthor()和removeAuthor( ))被称为。
这正是您的情况,因此by_reference
应设置为false
。
至于你得到的错误,我很确定你没有必要的getter / setter,尽管你认为你有。请检查其姓名中的拼写错误等。