我有一个愿望清单实体,它与使用MTM Doctrine注释的Product实体有关系。我有一个定义,$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内部服务器错误)
它在线上
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的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);
}