我的symfony项目中有一个嵌入表单,用于保留两个实体:Stockage.php
和Equipements.php
。
这些参与者之间的关系是 ManyToOne 。
这是Stockage.php
的代码:
class Stockage
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="nameStockage", type="string", length=150, nullable=true)
*/
private $nameStockage;
/**
* @var Equipements
*
* @ORM\ManyToOne(targetEntity="Equipements", inversedBy="stockage", cascade={"persist"})
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="equipements_id", referencedColumnName="id")
* })
*/
private $equipements;
/**
* Constructor
*/
public function __construct()
{
$this->equipements = new \Doctrine\Common\Collections\ArrayCollection();
}
public function __toString()
{
return $this->nameStockage;
}
/* ... getters and setters for id and name */
/**
* Set equipements
*
* @param \MySpace\MyBundle\Entity\Equipements $equipements
* @return Stockage
*/
public function setEquipements(\MySpace\MyBundle\Entity\Equipements $equipements)
{
$this->equipements[] = $equipements;
return $this;
}
/**
* Get equipements
*
* @return \MySpace\MyBundle\Entity\Equipements
*/
public function getEquipements()
{
return $this->equipements;
}
}
这是Equipements.php
的代码:
班级设备
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="nameEquipement", type="string", length=150, nullable=false)
*/
private $nameEquipement;
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\OneToMany(targetEntity="Stockage", mappedBy="equipements", cascade={"persist"})
*/
private $stockage;
/**
* Constructor
*/
public function __construct()
{
$this->stockage = new \Doctrine\Common\Collections\ArrayCollection();
}
public function __toString()
{
return $this->nameEquipement;
}
/* ... getters and setters for id and nameEquipement */
/**
* Set stockage
*
* @param \MySpace\MyBundle\Entity\Stockage $stockage
*
* @return Equipements
*/
public function setStockage(\MySpace\MyBundle\Entity\Stockage $stockage = null)
{
$this->stockage = $stockage;
return $this;
}
/**
* Get stockage
*
* @return \MySpace\MyBundle\Entity\Stockage
*/
public function getStockage()
{
return $this->stockage;
}
public function addStockage(Stockage $stockage)
{
if (!$this->stockage->contains($stockage)) {
$this->stockage->add($stockage);
}
}
}
当我添加一个Stockage元素时,我可以添加一个Equipement元素,所以这是嵌入形式 StockageType.php :
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('nameStockage')
->add('equipements', 'collection', array(
'label' => false,
'type' => new EquipementsType(),
'allow_add' => true,
'by_reference' => false,
))
;
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'MySpace\MyBundle\Entity\Stockage'
));
}
/**
* @return string
*/
public function getName()
{
return 'mySpace_myBundle_stockage';
}
当我提交表单时,我有错误:
参数1传递给MySpace / MyBundle / Entity / Stockage :: setEquipements 必须是MySpace \ MyBundle \ Entity \ Equipements实例的实例 给出的Doctrine \ Common \ Collections \ ArrayCollection,调用 C:\瓦帕\ WWW \ MyApp的\厂商\ symfony的\ symfony的\ SRC \的Symfony \元器件\ PropertyAccess \ PropertyAccessor.php 在第410行并定义', 'C:\ WAMP \ WWW \ MyApp的\ SRC \ MySpace的\ MyBundle \实体\ Stockage.php', '128',数组('this'=>对象(Stockage)))in 第128行的src / MySpace / MyBundle / Entity / Stockage.php
Stockage.php
中的 128 行是这一行:public function setEquipements(\MySpace\MyBundle\Entity\Equipements $equipements)
有人可以帮忙吗? Symfony需要回收一个集合吗?
我有一个实体Equipements.php
,可以属于 一个Stockage.php
或Generator.php
但设备不能同时。
因此,当我想添加一个设备时,如果设备是一个库存,我需要添加Stockage的特性,或者如果设备是一个发电机,则需要添加发电机的特性。这就是为什么我必须在EquipementType.php
或StockageType.php
中嵌入GeneratorType.php
(集合)。
PS:我把这个问题解决了,请关注@Jean评论以确保以正确的方式构建您的嵌入表单:如果您有OneToOne关系,请关注此link,否则跟随如何构建和返回一个嵌入式表单,其中包含@Jean等集合,并在他的演讲和答案中提出。
答案 0 :(得分:1)
您必须修复Equipements::setStockage()
方法,如下所示:
/**
* Set stockages
*
* @param ArrayCollection $stockage
*
* @return Equipements
*/
public function setStockages(ArrayCollection $stockage)
{
$this->stockage = $stockage;
return $this;
}