如何将实体与ManyToMany(Symfony)相关联?

时间:2019-01-02 16:54:32

标签: symfony oop many-to-many entity

在实体<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返回了

1 个答案:

答案 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关于PersistentCollectionArrayCollection