如何将实体与 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();
}

一些 关于 PersistentCollectionArrayCollection