У меня есть сущность 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()
работает отлично.
Что я делаю не так? Как решить эту проблему?
То, что вы ищете, это ArrayCollection’s removeElement($element)
функционировать, а не remove($key)
функция.
Как указано в их определениях remove($key)
функция удаляет элемент по указанному индексу ($ key) из коллекции, а removeElement($element)
удаляет указанный элемент из коллекции, если он найден.
Поскольку вы пытаетесь удалить товар как элемент, а не по его индексу, вы должны использовать removeElement($product)
,
Справочник по Doctrine ArrayCollection API Вот
НОТА: Ты используешь 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);
}