我有2个实体,产品和类别,下面定义了双向ManyToMany关联映射:
产品
/**
* @ORM\ManyToMany(targetEntity="Category", inversedBy="products")
* @ORM\JoinTable(name="products_categories")
*/
protected $categories;
// with these accessors
public function addCategories(Collection $categories)
{
foreach ($categories as $category)
{
$this->addCategory($category);
}
return $this;
}
public function addCategory(Category $category)
{
if (!$this->categories->contains($category))
{
$this->categories->add($category);
$category->addProduct($this);
}
return $this;
}
public function removeCategories(Collection $categories)
{
foreach ($categories as $category)
{
$this->removeCategory($category);
}
return $this;
}
public function removeCategory(Category $category)
{
if ($this->categories->contains($category))
{
$this->categories->removeElement($category);
$category->removeProduct($this);
}
return $this;
}
public function getCategories()
{
return $this->categories;
}
public function setCategories($categories)
{
$this->categories = new ArrayCollection();
foreach ($categories as $category)
{
$this->addCategory($category);
}
return $this;
}
类别实体:
/**
* @ORM\ManyToMany(targetEntity="Product", mappedBy="categories")
*/
protected $products;
// And accessors
public function addProducts(Collection $products)
{
foreach ($products as $product)
{
$this->addProduct($product);
}
return $this;
}
public function addProduct(Product $product)
{
if (!$this->products->contains($product))
{
$this->products->add($product);
$product->addCategory($this);
}
return $this;
}
public function removeProducts(Collection $products)
{
foreach ($products as $product)
{
$this->removeProduct($product);
}
return $this;
}
public function removeProduct(Product $product)
{
if ($this->products->contains($product))
{
$this->products->removeElement($product);
}
return $this;
}
public function getProducts()
{
return $this->products;
}
public function setProducts($products)
{
$this->products = new ArrayCollection();
foreach ($products as $product)
{
$this->addProduct($product);
}
return $this;
}
问题是:在ZF2表单中选择多个,为产品选择类别,我无法删除最后一个条目或删除所有条目......
除了最后一个之外,它一个接一个地工作。
修改 如果我删除所有元素,则不会调用removeCategories()。
非常感谢任何帮助
修改2
我发现了一个非常丑陋的解决方案来阻止这个错误...
实际上,当多重选择为空时,它会从$ _POST变量中消失...所以,在我的产品控制器中,在editAction()中,我进行了这个测试:
if (!isset($_POST['main']['categories']))
{
$product->getCategories()->clear();
}
我不认为这是一个很好的解决方案。
所以,如果有人有更好的解决方案,我正在等待答案。 TY
答案 0 :(得分:0)
这可能是ZF中的错误,请参阅:
https://github.com/zendframework/zf2/issues/4492
和PR with fix:
https://github.com/zendframework/zf2/pull/7447
编辑2 部分中的解决方案与我在代码中使用的解决方法相同,直到修复程序将被释放。
答案 1 :(得分:0)
如上面的评论所述,覆盖Form-> prepareBindData是一个解决方案。
class MyForm extends Form
{
...
protected function prepareBindData(array $values, array $match)
{
return $values;
}
}