如何将实体与 ManyToMany (Symfony) 相关联?
How can I relate entities with ManyToMany (Symfony)?
在实体 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
所以我将我的实体更改为:
/**
* @ORM\ManyToMany(targetEntity="Productgroup")
* @ORM\JoinColumn(name="productgroup", referencedColumnName="id")
*/
private $productgroup;
public function getProductgroup(): ?Productgroup
{
return $this->productgroup;
}
public function setProductgroup(?Productgroup $productgroup): self
{
$this->productgroup = $productgroup;
return $this;
}
现在我收到错误消息:
Return value of App\Entity\Products::getProductgroup() must be an
instance of App\Entity\Productgroup or null, instance of
Doctrine\ORM\PersistentCollection returned
在您的情况下,用于收集相关实体的内部存储空间为 PersistentCollection
。
因此,属性 productgroup
不是 ProductGroup
实体。它是 ProductGroup
个实体的集合。为简单起见,您可以将其视为 "array of items".
根据上面所说,您的 getProductgroup
不是 ProductGroup
的 return 实例,它 return 是 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();
}
一些 关于 PersistentCollection
和 ArrayCollection
。
在实体 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
所以我将我的实体更改为:
/**
* @ORM\ManyToMany(targetEntity="Productgroup")
* @ORM\JoinColumn(name="productgroup", referencedColumnName="id")
*/
private $productgroup;
public function getProductgroup(): ?Productgroup
{
return $this->productgroup;
}
public function setProductgroup(?Productgroup $productgroup): self
{
$this->productgroup = $productgroup;
return $this;
}
现在我收到错误消息:
Return value of App\Entity\Products::getProductgroup() must be an instance of App\Entity\Productgroup or null, instance of Doctrine\ORM\PersistentCollection returned
在您的情况下,用于收集相关实体的内部存储空间为 PersistentCollection
。
因此,属性 productgroup
不是 ProductGroup
实体。它是 ProductGroup
个实体的集合。为简单起见,您可以将其视为 "array of items".
根据上面所说,您的 getProductgroup
不是 ProductGroup
的 return 实例,它 return 是 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();
}
一些 PersistentCollection
和 ArrayCollection
。