Как я могу связать сущности с ManyToMany (Symfony)? - PullRequest
0 голосов
/ 02 января 2019

В организации 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;
    }

Теперь я получаю сообщение об ошибке:

Возвращаемое значение App \ Entity \ Products :: getProductgroup () должно быть экземпляр App \ Entity \ Productgroup или null, экземпляр Doctrine \ ORM \ PersistentCollection возвращено

1 Ответ

0 голосов
/ 02 января 2019

Внутреннее хранилище для сбора связанных сущностей 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();
}

Некоторые Другие данные о PersistentCollection и ArrayCollection.

...