ZF2 / Doctrine /无法从ArrayCollection中删除所有元素

时间:2015-05-30 11:27:56

标签: php doctrine-orm zend-framework2

我有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

2 个答案:

答案 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;
    }
}