Symfony 3, метод ArrayCollection remove () вызывает ошибку «Предупреждение: недопустимый тип смещения в isset или пустой» - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть сущность 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() работает нормально.Что я делаю не так?Как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

ПРИМЕЧАНИЕ: Вы используете 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);
}
0 голосов
/ 19 сентября 2018

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

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

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

Справочник по Doctrine ArrayCollection API здесь

...