ZF2 / Doctrine / Невозможно удалить все элементы из ArrayCollection

1

У меня есть 2 объекта, Product и Category с двунаправленным сопоставлением ассоциаций 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... Итак, в моем контроллере Product в editAction() я делаю этот тест:

if (!isset($_POST['main']['categories']))
{
    $product->getCategories()->clear();
}

Я не считаю этот хак хорошим решением.

Итак, если у кого-то есть лучшее решение, я жду ответа. TY

  • 0
    Вы пытались добавить 'cascade = "persist"' на стороне продукта отношения?
  • 0
    Да, @tony19 tony19 был прав. И посмотрите, поможет ли этот пост, stackoverflow.com/questions/2603595/…
Теги:
doctrine2
zend-framework2

2 ответа

0
Лучший ответ

Это возможная ошибка в ZF, см.

https://github.com/zendframework/zf2/issues/4492

и PR с исправлением:

https://github.com/zendframework/zf2/pull/7447

Ваше решение в разделе " Редактировать 2 " - это то же обходное решение, которое я использую в своем коде до тех пор, пока не будет выпущено исправление.

  • 0
    @ Ику, спасибо за этот ответ, но я здесь не использую элемент Zend\Form\Element\Collection . Но Zend\Form\Element\Select с несколькими свойствами
  • 1
    @ceadreak Это ошибка больше в методе Zend\Form\Form::prepareBindData . Если вы публикуете, вы выбираете элемент пустым, в $ _POST нет данных для этого элемента, и он пропускается из-за гидратации. Вот почему не removeCategories ваш метод removeCategories .
Показать ещё 3 комментария
0

Как сказано в комментариях выше, переопределение Form-> prepareBindData - это решение.

class MyForm extends Form
{
    ...

    protected function prepareBindData(array $values, array $match)
    {
        return $values;
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню