Symfony 3, метод ArrayCollection remove () вызывает ошибку & quot; Предупреждение: недопустимый тип смещения в isset или пустой & quot;

У меня есть сущность Wishlist, которая связана с сущностью Product с помощью аннотации MTM Doctrine.
У меня есть определение, что $products является Array Collection В __construct () списка желаний, и именно поэтому у меня есть addProduct() а также removeProduct() методы.
Итак, класс имеет следующий вид:

<?php

namespace WishlistBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use ShopBundle\Entity\Product;

/**
* Wishlist
*
* @ORM\Table(name="wishlist")
* @ORM\Entity()
*/
class Wishlist
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @ORM\ManyToMany(targetEntity="ShopBundle\Entity\Product")
* @ORM\JoinTable(
*     name="mtm_products_in_wishlists",
*     joinColumns={
*     @ORM\JoinColumn(
*     name="wishlist_id",
*     referencedColumnName="id"*     )
* },
*     inverseJoinColumns={
*     @ORM\JoinColumn(
*     name="product_id",
*     referencedColumnName="id",
*     unique=true
*     )
* }
*     )
*/
private $products;

...

/**
* @param Product $product
*/
public function addProduct(Product $product)
{
$this->products->add($product);
}

/**
* @param Product $product
*/
public function removeProduct(Product $product)
{
$this->products->remove($product);
}

/**
* Get products.
*
* @return string
*/
public function getProducts()
{
return $this->products;
}

/**
* Wishlist constructor.
*/
public function __construct()
{
$this->products  = new ArrayCollection();
}
}

В моем контроллере у меня есть место, где я пытаюсь использовать removeProduct() метод. Я использую это следующим образом:

$wishlist->removeProduct($product);

Но я получаю следующую ошибку:

Предупреждение: недопустимый тип смещения в isset или пуст (500 Internal Server Error)

Это на линии в

vendor\doctrine\collections\lib\Doctrine\Common\Collections\ArrayCollection.php at line 126

Он имеет следующий вид:

public function remove($key)
{
if ( ! isset($this->elements[$key]) && ! array_key_exists($key, $this->elements)) {
return null;
}
}

В то же время, addProduct() работает отлично.
Что я делаю не так? Как решить эту проблему?

0

Решение

То, что вы ищете, это ArrayCollection’s removeElement($element) функционировать, а не remove($key) функция.

Как указано в их определениях remove($key) функция удаляет элемент по указанному индексу ($ key) из коллекции, а removeElement($element) удаляет указанный элемент из коллекции, если он найден.

Поскольку вы пытаетесь удалить товар как элемент, а не по его индексу, вы должны использовать removeElement($product),

Справочник по Doctrine ArrayCollection API Вот

4

Другие решения

НОТА: Ты используешь ArrayCollection,

/**
* @param Product $product
*/
public function addProduct(Product $product)
{
$this->products->add($product);
}

/**
* @param Product $product
*/
public function removeProduct(Product $product)
{
$this->products->removeElement($product);
}
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector