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 与 PersistentCollection
在 Symfony 中通过 ajax 为 ArrayCollection 数据传递 POST json 对象
Symfony-Catchable致命错误:传递给Doctrine Common Collections ArrayCollection :: __ construct()的参数1必须是类(代码
Symfony 2,未定义的变量,在构造函数中初始化为 ArrayCollection 的受保护成员通过错误,它是未定义的