Symfony 3.4中ArrayCollection / OneToMany关系的类型错误

时间:2018-11-19 19:37:31

标签: symfony doctrine-orm arraycollection

在过去的几天里,我一直试图在Symfony 3.4中创建双向的ManyToOne-OneToMany关系。 我有两个实体。一个是贡献,另一个是来源。一个贡献可以有多个来源。所以关系应该是

  

贡献– ManyToOne –来源– OneToMany –贡献

但是在SQL = "UPDATE tblDispatch td " & _ "SET td.NumOfStops = Dlookup(""NumOfStops"", ""qryStops"", ""PK = "" & td.PK) " & _ "WHERE td.DispatchDate = #" & Me.tbDate.Value & "#;" DoCmd.RunSQL SQL 期间,我的控制器始终出现以下错误:

  

类型错误:传递给Doctrine \ Common \ Collections \ ArrayCollection :: __ construct()的参数1必须为数组类型,给定对象,在/ var / www / html / Edebate / vendor / doctrine / orm / lib中调用/Doctrine/ORM/UnitOfWork.php,第605行

我没有任何与Entity Contribution中的Array Collection相关的set方法,就像我在此处的其他帖子中看到的那样:

Type error: Argument 1 passed to Doctrine\Common\Collections\ArrayCollection::__construct() must be of the type array, object given

Symfony-Catchable Fatal Error: Argument 1 passed to Doctrine\Common\Collections\ArrayCollection::__construct() must be of the type array, object given

这里的注释还可以:

Doctrine OneToMany relationship error

任何帮助将不胜感激! :)

这是我的实体捐款

$em→flush();

这是在我的实体来源中:

use Doctrine\Common\Collections\ArrayCollection;

//annotations

  abstract class Contribution
    {

    /**
    * @ORM\OneToMany(targetEntity="Shaker\DebateBundle\Entity\Source", mappedBy="parent")
    */
    protected $sources;

//Other attributes and methods


    public function __construct() {
       $this->sources = new ArrayCollection();
    }


    /**
     * Add source
     *
     * @param \Shaker\DebateBundle\Entity\Source $source
     *
     * @return Contribution
     */
    public function addSource(\Shaker\DebateBundle\Entity\Source $source)
    {
        $this->sources[] = $source;
        return $this;
    }

    /**
     * Remove source
     *
     * @param \Shaker\DebateBundle\Entity\Source $source
     */
    public function removeSource(\Shaker\DebateBundle\Entity\Source $source)
    {
        $this->sources->removeElement($source);
    }

    /**
     * Get sources
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getSources()
    {
        return $this->sources;
    }
}

在我的控制器中,冲洗出现了问题:

/**
* @ORM\ManyToOne(targetEntity="Shaker\DebateBundle\Entity\Contribution", inversedBy="sources")
*/
protected $parent;

   /**
     * Set parent
     *
     * @param \Shaker\DebateBundle\Entity\Contribution $parent
     *
     * @return Contribution
     */
    public function setParent(\Shaker\DebateBundle\Entity\Contribution $parent = null)
    {
        $this->parent = $parent;
        $parent->addSource($this);
        return $this;
    }

    /**
     * Get parent
     *
     * @return \Shaker\JRQBundle\Entity\Contribution
     */
    public function getParent()
    {
        return $this->parent;
    }

2 个答案:

答案 0 :(得分:0)

我不太了解您的问题。但是,您是否尝试在Source实体中使用这种语法?

private $parent;
// ...

public function __construct() {
    $this->parent = new ArrayCollection();
    // or new \Doctrine\Common\Collections\ArrayCollection();
}

我认为您忘记了该类中的构造函数。

答案 1 :(得分:0)

我认为您在使用集合时会“切换”一些逻辑。我认为您的“添加”方法应如下所示:

public function addSource(\Shaker\DebateBundle\Entity\Source $source)
{
    $this->sources[] = $source;
    $source->setParent($this);

    return $this;
}

在另一个实体中:

public function setParent(\Shaker\DebateBundle\Entity\Contribution $parent = null)
{
    $this->parent = $parent;

    return $this;
}

控制器代码段中缺少变量以及表单字段定义,因此提交表单后您不应做太多工作。尝试直接映射尽可能多的字段(即使通过自动猜测),即使它看起来很丑,但可以,但是以后可以美化。只是我的两分钱,有几个月的延迟。