【发布时间】:2015-07-01 11:29:47
【问题描述】:
我的 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 的实例,instance Doctrine\Common\Collections\ArrayCollection 给定,调用 C:\wamp\www\MyApp\vendor\symfony\symfony\src\Symfony\Component\PropertyAccess\PropertyAccessor.php 在第 410 行并定义', 'C:\wamp\www\MyApp\src\MySpace\MyBundle\Entity\Stockage.php', '128', array('this' => object(Stockage))) in src/MySpace/MyBundle/Entity/Stockage.php 在第 128 行
Stockage.php 中的 128 行是这一行:public function setEquipements(\MySpace\MyBundle\Entity\Equipements $equipements)
有人可以帮忙吗? Symfony 需要返回一个集合对吗?
编辑
我有一个实体Equipements.php,它可以属于任一Stockage.php 或Generator.php,但设备不能同时属于。
所以当我想添加设备时,如果设备是库存,我也需要添加 Stockage 的特性,或者如果设备是发电机,则需要添加发电机的特性。这就是为什么我必须在StockageType.php 或GeneratorType.php 中嵌入EquipementType.php(集合)。
PS:我把这个问题解决了,请按照@Jean cmets 确保有正确的方式来构建您的嵌入表单:如果您有 OneToOne 关系,请按照此 link,否则按照构建并返回一个嵌入表单,其中包含@Jean 在他的评论和回答中建议的集合。
【问题讨论】:
-
不一致.. 如果是 OneToOne,Equipments 不应该是 ArrayCollection,而是单个 Equipment。如果不是这样,应该是OneToMany关系
-
您已经为
equipements设置了关系OneToOne,并且您使用的collection类型字段是错误的 -
对不起一个新手错误:我必须在 Stockage.php 中更改 ManyToOne 中的 OneToOne 关系。我已经用关系更新了我的代码。但是当我提交表单时,我发生了同样的错误。
-
正如@Jean 所说。
OneToOne和ManyToOne之间的区别是一个额外的唯一键。collection表单类型用于您希望获得对象集合的一侧 - 这意味着您的 FormType 与属性Equipments的实体stockage相关。不是相反。 -
@french_dev 你也改变了getter和setter吗?
标签: php forms symfony collections doctrine-orm