在实体<div class="container" style="">
<hr style="width:80%">
<nav class="custom-navbar">
<a href="/">Home</a>
<a href="/architecture/">Architecture</a>
<a href="/product/">Product</a>
<a href="/portraits/">Portraits</a>
<a href="/wildlife/">Wildlife</a>
<a href="/about/">About</a>
</nav>
</div>
<div class="container">
<img class="" src="https://www.rishulbangar.com/img/baan-thai-cover.jpg">
</div>
中,我将我的产品与我的产品组相关联:
products
这很好。
例如,这是结果:
/**
* @ORM\ManyToOne(targetEntity="Productgroup")
* @ORM\JoinColumn(name="productgroup", referencedColumnName="id")
*/
private $productgroup;
但是有时我的产品具有多个产品组,如下所示:
Product Productgroup
Frog Animal
Fish Animal
Pizza Food
所以我将实体更改为此:
Frog Animal
Fish Animal, Food
Pizza Food
现在我收到错误消息:
App \ Entity \ Products :: getProductgroup()的返回值必须为 App \ Entity \ Productgroup的实例,或者为null,则为 Doctrine \ ORM \ PersistentCollection返回了
答案 0 :(得分:1)
用于收集相关实体的内部存储空间为PersistentCollection
。
因此,属性productgroup
不是ProductGroup
实体。它是 ProductGroup
个实体的集合。为简单起见,您可以将其视为“项目数组”。
根据上述情况,您的getProductgroup
不返回ProductGroup
的实例,而是返回集合ProductGroup
s ,这就是为什么应重写此方法的原因为:
// no typehint here
// Of course you can use `PersistentCollection` typehint, it is your choice
// main point that returned value is NOT a `ProductGroup` instance
public function getProductgroup()
{
return $this->productgroup;
}
第二,由于属性productgroup
不是ProductGroup
,因此您的setProductgroup
方法也应被重写:
// I omit typehint as you pass not instance of `Productgroup`, but `collection`
public function setProductgroup($productgroup): self
{
$this->productgroup = $productgroup;
return $this;
}
通常,要将Productgroup
的一个实例添加到集合中,应该有一个adder
方法:
// here, you can typehint argument, because it is useless
// to pass anything else except `Productgroup` instance
public function addProductgroup(Productgroup $productgroup): self
{
$this->productgroup[] = $productgroup;
return $this;
}
此外,最好将$this->productgroup
初始化为构造函数中的空集合:
public function __construct()
{
$this->productgroup = new ArrayCollection();
}
一些other info关于PersistentCollection
和ArrayCollection
。