Symfony 3,ArrayCollection的remove()导致错误“警告:isset中的非法偏移类型或为空”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Symfony 3,ArrayCollection的remove()导致错误“警告:isset中的非法偏移类型或为空”相关的知识,希望对你有一定的参考价值。

我有一个愿望清单实体,它与使用MTM Doctrine注释的Product实体有关系。我有一个定义,$products是一个Array Collection在愿望清单的__construct(),这就是为什么我有addProduct()removeProduct()方法。因此,该类具有以下视图:

<?php

namespace WishlistBundleEntity;

use DoctrineCommonCollectionsArrayCollection;
use DoctrineORMMapping as ORM;
use ShopBundleEntityProduct;

/**
 * Wishlist
 *
 * @ORMTable(name="wishlist")
 * @ORMEntity()
 */
class Wishlist
{
    /**
     * @var int
     *
     * @ORMColumn(name="id", type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORMManyToMany(targetEntity="ShopBundleEntityProduct")
     * @ORMJoinTable(
     *     name="mtm_products_in_wishlists",
     *     joinColumns={
     *     @ORMJoinColumn(
     *     name="wishlist_id",
     *     referencedColumnName="id"
     *     )
     * },
     *     inverseJoinColumns={
     *     @ORMJoinColumn(
     *     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内部服务器错误)

它在线上

vendordoctrinecollectionslibDoctrineCommonCollectionsArrayCollection.php at line 126

它有以下观点:

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

与此同时,addProduct()工作正常。我做错了什么?如何解决这个问题?

答案

您正在寻找的是ArrayCollection的removeElement($element)函数而不是remove($key)函数。

正如其定义所示,remove($key)函数从集合中删除指定索引($ key)处的元素,而removeElement($element)从集合中删除指定的元素(如果找到)。

由于您尝试将产品作为元素而不是其索引删除,因此您应该使用removeElement($product)

Doctrine ArrayCollection API参考here

另一答案

注意:您正在使用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);
}

以上是关于Symfony 3,ArrayCollection的remove()导致错误“警告:isset中的非法偏移类型或为空”的主要内容,如果未能解决你的问题,请参考以下文章

Symfony ArrayCollection

Symfony ArrayCollection 与 PersistentCollection

在 Symfony 中通过 ajax 为 ArrayCollection 数据传递 POST json 对象

Symfony-Catchable致命错误:传递给Doctrine Common Collections ArrayCollection :: __ construct()的参数1必须是类(代码

Symfony 2,未定义的变量,在构造函数中初始化为 ArrayCollection 的受保护成员通过错误,它是未定义的

为啥 symfony 学说 findall() 返回 id NULL