Я работаю с 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. Что я делаю неправильно, удаляя элементы из коллекции в несопоставленном поле коллекции формы?




Пожалуйста, попробуйте это
foreach ($quoteItem->getQuoteItemAdditionalWorks() as $existingAdditionalWorkItem)
{
if (false === $updatedAdditionalWorkItems->contains($existingAdditionalWorkItem))
{
$quoteItem->getQuoteItemAdditionalWorks()->removeElement($existingAdditionalWorkItem);
$em->remove($existingAdditionalWorkItem);
}
}
-> removeElement () работал. Спасибо. Его нужно было использовать как $ quoteItem-> getQuoteItemAdditionalWorks () -> removeElement ($ ex istingAdditionalWork Item);