@stunoff

Как в Symfony 4 создать many to many форму, с возможностью выбора ассоциативных данных?

Не могу понять как в симфони 4 создать форму, в которой я, при добавлении/обновлении продуктов, мог бы добавлять/удалять категории для редактируемого продукта. Ассоциация many to many.
У меня есть две сущности Product и Category со связывающей таблицей product_category. Код ниже сокращен для простоты

Product entity:
<?php

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
 */
class Product
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;
    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Category", inversedBy="products")
     */
    private $category;
    
    public function __construct()
    {
        $this->category = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    /**
     * @return Collection|Category[]
     */
    public function getCategory(): Collection
    {
        return $this->category;
    }

    public function addCategory(Category $category): self
    {
        if (!$this->category->contains($category)) {
            $this->category[] = $category;
        }

        return $this;
    }

    public function removeCategory(Category $category): self
    {
        if ($this->category->contains($category)) {
            $this->category->removeElement($category);
        }

        return $this;
    }
}


Category entity:
<?php

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\CategoryRepository")
 */
class Category
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Product", mappedBy="category")
     */
    private $products;

    public function __construct()
    {
        $this->products = new ArrayCollection();
    }
    /**
     * @return Collection|Product[]
     */
    public function getProducts(): Collection
    {
        return $this->products;
    }

    public function addProduct(Product $product): self
    {
        if (!$this->products->contains($product)) {
            $this->products[] = $product;
            $product->addCategory($this);
        }

        return $this;
    }

    public function removeProduct(Product $product): self
    {
        if ($this->products->contains($product)) {
            $this->products->removeElement($product);
            $product->removeCategory($this);
        }

        return $this;
    }
}


И соответсвенно таблицы:

create table product
(
    id               int auto_increment        primary key
);


create table category
(
    id      int auto_increment        primary key
);


И связующая таблица:

create table product_category
(
    product_id  int,
    category_id int 
)


В итоге как не пытался, максимум что получалось, это сделать форму, в которой я могу при обновлении продукта только обновлять ИМЯ категории. Но как удалить или добавить новую категорию у продукта понять не могу. Разумеется, в отдельных формах, и продукты и категории успешно обрабатываются.
Кто может чего подсказать или дать ссылку на рабочий пример? Офф доки читал, и делал всё по ним, что и привело меня к результату возможности изменения имени категории в форме продукта. Гугл тоже не сильно помог в этом вопросе
  • Вопрос задан
  • 2178 просмотров
Решения вопроса 1
Minifets
@Minifets
Hello world!!!
Если коротко, то в symfony нет нужного вам form type.
Есть EntityType, который работает с уже созданными записями в таблице и позволяет привязывать уже существующие категории к продукту, но создать новые категории, редактирую продукт, через нее не получится.

P.S. Хотя нет, вру. То что вам нужно: Коллекция форм.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@guyasyou
Я сам пытался решить свою подобную задачу через Коллекция форм. - не вышло...
Потом нашел в демо блоге от Symfony решение через трансформеры, куда понятней, как по мне. Смотрите как там читают и сохраняют теги.
  • transform - из сущности в форму
  • reverseTransform - из формы в сущности

Реализовал селекторы с multiple данным способом - все отлично, и читает и сохраняет!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы