在过去的几天里,我一直在尝试在Symfony 3.4中创建双向ManyToOne OneToMany关系我有两个实体。一个是贡献,另一个是来源。一个贡献可以有几个来源。所以关系应该是
贡献–ManyToOne–来源–OneToMany–贡献
但在控制器中的$em→flush();
期间,我一直收到以下错误:
类型错误:传递给Doctrine\Common\Collections\ArrayCollection::__construct(
我在实体贡献中没有任何与数组集合相关的集合方法,正如我在其他帖子中看到的那样:
类型错误:传递给Doctrine\Common\Collections\ArrayCollection::__construct((的参数1的类型必须是数组,对象给定
Symfony Catchable致命错误:传递给Doctrine\Common\Collections\ArrayCollection::__construct((的参数1必须是给定的对象的数组类型
注释如下所述:
条令一对多关系错误
任何帮助都将不胜感激!:(
这是我的实体贡献
use DoctrineCommonCollectionsArrayCollection;
//annotations
abstract class Contribution
{
/**
* @ORMOneToMany(targetEntity="ShakerDebateBundleEntitySource", mappedBy="parent")
*/
protected $sources;
//Other attributes and methods
public function __construct() {
$this->sources = new ArrayCollection();
}
/**
* Add source
*
* @param ShakerDebateBundleEntitySource $source
*
* @return Contribution
*/
public function addSource(ShakerDebateBundleEntitySource $source)
{
$this->sources[] = $source;
return $this;
}
/**
* Remove source
*
* @param ShakerDebateBundleEntitySource $source
*/
public function removeSource(ShakerDebateBundleEntitySource $source)
{
$this->sources->removeElement($source);
}
/**
* Get sources
*
* @return DoctrineCommonCollectionsCollection
*/
public function getSources()
{
return $this->sources;
}
}
这是在我的实体来源:
/**
* @ORMManyToOne(targetEntity="ShakerDebateBundleEntityContribution", inversedBy="sources")
*/
protected $parent;
/**
* Set parent
*
* @param ShakerDebateBundleEntityContribution $parent
*
* @return Contribution
*/
public function setParent(ShakerDebateBundleEntityContribution $parent = null)
{
$this->parent = $parent;
$parent->addSource($this);
return $this;
}
/**
* Get parent
*
* @return ShakerJRQBundleEntityContribution
*/
public function getParent()
{
return $this->parent;
}
在我的控制器中,flush出现了问题:
$formsourcebook->handleRequest($request);
$contributionid=$formsourcebook->get('ContributionId')->getData();
if ($formsourcebook->isValid()) {
$topicargtarget=$this->getContribution($contributionid);
$sourcebook->setUser($user);
$sourcebook->setContribution($topicargtarget);
$em->persist($sourcebook);
$em->flush();
}
我不太了解你的问题。但是,您在Source实体中尝试过这种语法吗?
private $parent;
// ...
public function __construct() {
$this->parent = new ArrayCollection();
// or new DoctrineCommonCollectionsArrayCollection();
}
我想你忘了课上的构造函数了。
我认为您在处理集合时"切换"了一些逻辑。以下是我认为你的"添加"方法应该是什么样子的:
public function addSource(ShakerDebateBundleEntitySource $source)
{
$this->sources[] = $source;
$source->setParent($this);
return $this;
}
在另一个实体:
public function setParent(ShakerDebateBundleEntityContribution $parent = null)
{
$this->parent = $parent;
return $this;
}
控制器代码段中缺少变量以及表单字段定义,因此在提交表单后不应该做太多工作。尝试直接映射尽可能多的字段(即使是通过自动签名(,即使它看起来很难看,但有效,但稍后可以进行美化。只有我的两分钱,还有几个月的延迟。