【问题标题】:CatchableFatalError to submit an embed form to persist entities (Argument 1 passed must be an instance of Entity, instance ArrayCollection given)CatchableFatalError 提交嵌入表单以持久化实体(传递的参数 1 必须是 Entity 的实例,给定的实例 ArrayCollection)
【发布时间】:2015-07-01 11:29:47
【问题描述】:

我的 symfony 项目中有一个嵌入表单,用于持久化两个实体:Stockage.phpEquipements.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.phpGenerator.php,但设备不能同时属于

所以当我想添加设备时,如果设备是库存,我也需要添加 Stockage 的特性,或者如果设备是发电机,则需要添加发电机的特性。这就是为什么我必须在StockageType.phpGeneratorType.php 中嵌入EquipementType.php(集合)。

PS:我把这个问题解决了,请按照@Jean cmets 确保有正确的方式来构建您的嵌入表单:如果您有 OneToOne 关系,请按照此 link,否则按照构建并返回一个嵌入表单,其中包含@Jean 在他的评论和回答中建议的集合。

【问题讨论】:

  • 不一致.. 如果是 OneToOne,Equipments 不应该是 ArrayCollection,而是单个 Equipment。如果不是这样,应该是OneToMany关系
  • 您已经为equipements 设置了关系OneToOne,并且您使用的collection 类型字段是错误的
  • 对不起一个新手错误:我必须在 Stockage.php 中更改 ManyToOne 中的 OneToOne 关系。我已经用关系更新了我的代码。但是当我提交表单时,我发生了同样的错误。
  • 正如@Jean 所说。 OneToOneManyToOne 之间的区别是一个额外的唯一键。 collection 表单类型用于您希望获得对象集合的一侧 - 这意味着您的 FormType 与属性 Equipments 的实体 stockage 相关。不是相反。
  • @french_dev 你也改变了getter和setter吗?

标签: php forms symfony collections doctrine-orm


【解决方案1】:

您必须修复Equipements::setStockage() 方法,如下所示:

/**
 * Set stockages
 *
 * @param ArrayCollection $stockage
 *
 * @return Equipements
 */
public function setStockages(ArrayCollection $stockage)
{
    $this->stockage = $stockage;

    return $this;
}

【讨论】:

  • 事实上,如果我有收藏品,你的答案是好的,但我可以告诉你,我有一个 One(Stockage)ToOne(equipement)。所以我不需要收藏。创建具有集合类型的嵌入表单是错误的。我在我的代码中进行了所有更改,就像我不需要集合一样,并且一切正常。当然,你的回答很适合收藏,我刚刚测试过她。谢谢你,你摇滚!我关注这个link 和这个one too
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 2015-05-11
  • 2017-04-06
  • 1970-01-01
相关资源
最近更新 更多