在过去的几天里,我一直试图在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方法,就像我在此处的其他帖子中看到的那样:
这里的注释还可以:
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;
}
答案 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;
}
控制器代码段中缺少变量以及表单字段定义,因此提交表单后您不应做太多工作。尝试直接映射尽可能多的字段(即使通过自动猜测),即使它看起来很丑,但可以,但是以后可以美化。只是我的两分钱,有几个月的延迟。