Как сохранить данные OneToMany Relationship в Symfony?

Я столкнулся с проблемой сохранения данных отношений OneToMany в базе данных. Ниже приведен код:

Тип вещи

->add('title')
->add('image',FileType::class)
->add('size', CollectionType::class,[
    'entry_type'=> SizeType::class,
    'entry_options' => ['label' => false],
    'by_reference' => false,
    'allow_add' =>true,
    'allow_delete' => true
])
->add('content',CKEditorType::class)
->add('save', SubmitType::class);

Объект объекта

class Item
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type = "integer")
     */
    private $id;

    /**
     * @ORM\Column(type = "string", length=255)
     */
    private $title;

    /**
     * @ORM\OneToMany(targetEntity=Size::class, mappedBy = "size",cascade = {"persist"})
     */
    private $size;

    public function __construct()
    {
        $this->size = new ArrayCollection();
    }

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

    /**
     * @return Collection|Size[]
     */
    public function getSize(): Collection
    {
        return $this->size;
    }

    public function addSize(Size $size): self
    {
        if (!$this->size->contains($size)) {
            $this->size[] = $size;
            $size->setSize($this);
        }

        return $this;
    }

    public function removeSize(Size $size): self
    {
        if ($this->size->removeElement($size)) {
            // set the owning side to null (unless already changed)
            if ($size->getSize() === $this) {
                $size->setSize(null);
            }
        }

        return $this;
    }
}

Размер объекта

class Size
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type = "integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity=Item::class, inversedBy = "size", fetch = "EAGER")
     */
    private $size;

    public function getSize(): ?Item
    {
        return $this->size;
    }

    public function setSize(?Item $size): self
    {
        $this->size = $size;

        return $this;
    }
}

Контроллер

/**
 * @Route("/admin/post-product", name = "post_product")
 */
public function postProduct(Request $request, SluggerInterface $slugger): Response
{
    $item = new Item();   
    $size = new Size();
    $form = $this->createForm(ItemType::class, $item);
    $form->handleRequest($request);
    if ($form->isSubmitted()){
        $file_image = $form->get('image')->getData();

        dump($item->getSize());
        //die;
        if ($file_image){
           //image
        }

        $sizes = $item->getSize();
        $item->addSize($sizes);

        $em = $this->getDoctrine()->getManager();
        $em->persist($item);
        $em->flush();

        return $this->redirectToRoute('post_product');
    }
    return $this->render('admin/post-product.html.twig',[

        'form' => $form->createView(),
    ]);
} 

Моя проблема в том, что я не могу сохранить данные в базу данных, которую я пробовал с помощью циклов, но не смог. Класс Item является одним целым с Size. Какой товар имеет соответствующие размеры (s, m, l, xl, xxl). Чего я хочу добиться здесь, так это того, что когда я нажимаю кнопку «Сохранить», элемент и таблица размеров должны быть заполнены. Пожалуйста, помогите мне..

Добро пожаловать в Stack Overflow. Обращаясь за помощью в отладке, мы просим вас сократить свой код, сделав минимально воспроизводимый пример. Это полезно для людей, чтобы понять вашу проблему, не просматривая весь код.

fjplaurr 17.12.2020 20:28

Просто чтобы продолжить то, что предложил @fjplaurr, используйте ссылку «Изменить» в левом нижнем углу вашего вопроса и избавьтесь от опубликованного кода, за исключением вещей, связанных с размером. Поскольку вопрос в настоящее время стоит, слишком много неуместного шума, чтобы пробираться. Я подозреваю, что Size::setItem никогда не вызывается, но это всего лишь предположение, и мне лень копировать/вставлять ваш код в IDE для проверки.

Cerad 18.12.2020 13:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
2
103
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы пытаетесь сохранить отношение с обратной стороны (той, у которой есть mappedBy). Доктрина не будет проверять отношение при сохранении обратной стороны. В этом конкретном случае, я думаю, вы перепутали владеющие/обратные стороны. Я бы попытался поместить inversedBy в ваш класс Item, а mappedBy в класс Size.

Если вы хотите сохранить отношения как есть. Вам нужно будет установить свойство на стороне-владельце при установке свойства на обратной стороне.

Другие вопросы по теме