Удаление элементов из коллекции в доктрине

Я работаю с Symfony 3.x и Doctrine. У меня есть объект коллекции quoteItemAdditionalWork, связанный с объектом QuoteItem. У меня есть еще одна организация под названием WorkOrder. Сущность WorkOrder - это назначенный data_class для формы WorkOrderType. В форме WorkOrderType мне нужно включить элементы формы из объекта QuoteItem как несопоставленные поля формы (один data_class для каждого типа формы - правило symfony). Коллекция форм quoteItemAdditionalWork является одним из полей формы, включенных в форму WorkOrderType, и не отображается в форме, поскольку quoteItemAdditionalWork не имеет связи сущности с WorkOrder.

public function buildForm (FormBuilderInterface $builder, array $options)
{
    $builder->add('quoteItemAdditionalWorks', CollectionType::class, [
        'data'          => $quoteItem->getQuoteItemAdditionalWorks(),
        'label'         => false,
        'mapped'        => false,
        'entry_type'    => QuoteItemAdditionalWorkType::class,
        'entry_options' => ['label' => false],
        'by_reference'  => false,
        'allow_add'     => true,
        'allow_delete'  => true,
        'prototype'     => true,
    ]);
}

Коллекция форм отлично работает с формой, но при отправке и попытке удалить элементы коллекции из сущности доктрины в контроллере элементы не удаляются. Код контроллера для удаления элементов выглядит так:

$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
    $em = $this->getDoctrine()->getManager();

    $quoteItem->setDrawingNumber($form->get('drawingNumber')->getData());
    $quoteItem->setDrawingRevision($form->get('drawingRevision')->getData());

    $updatedAdditionalWorkItems = $form->get('quoteItemAdditionalWorks')->getData()->unwrap();
    foreach ($quoteItem->getQuoteItemAdditionalWorks() as $existingAdditionalWorkItem) {
        if (false === $updatedAdditionalWorkItems->contains($existingAdditionalWorkItem)) {
            $em->remove($existingAdditionalWorkItem);
        }
    }

    $em->persist($quoteItem);
    $em->persist($workOrder);

    $em->flush();
}

Я не знаю, что я делаю неправильно в Symfony или в Doctrine. Что я делаю неправильно, удаляя элементы из коллекции в несопоставленном поле коллекции формы?

Стоит ли изучать 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 нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
0
831
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Пожалуйста, попробуйте это

foreach ($quoteItem->getQuoteItemAdditionalWorks() as $existingAdditionalWorkItem) 
{
    if (false === $updatedAdditionalWorkItems->contains($existingAdditionalWorkItem))
        {
            $quoteItem->getQuoteItemAdditionalWorks()->removeElement($existingAdditionalWorkItem);
            $em->remove($existingAdditionalWorkItem);
        }
}

-> removeElement () работал. Спасибо. Его нужно было использовать как $ quoteItem-> getQuoteItemAdditionalWorks () -> removeElement ($ ex‌ istingAdditionalWork‌ Item);

drwoodchip 15.08.2018 21:26

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