Symfony 从原则中的集合中删除项目

Symfony 从原则中的集合中删除项目,symfony,doctrine,formcollection,Symfony,Doctrine,Formcollection,我正在使用Symfony 3.x和Doctrine。我有一个集合实体quoteItemAdditionalWork,它与QuoteItem实体关联。我有另一个实体叫做WorkOrder。WorkOrder实体是表单WorkOrderType的指定数据类。在WorkOrderType表单上,我需要将QuoteItem实体中的表单元素作为未映射的表单字段包含在内(每个表单类型一个数据类-symfony规则)。表单集合quoteItemAdditionalWork是WorkOrderType表单中包含

我正在使用Symfony 3.x和Doctrine。我有一个集合实体quoteItemAdditionalWork,它与QuoteItem实体关联。我有另一个实体叫做WorkOrder。WorkOrder实体是表单WorkOrderType的指定数据类。在WorkOrderType表单上,我需要将QuoteItem实体中的表单元素作为未映射的表单字段包含在内(每个表单类型一个数据类-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还是在教义上做错了什么。在未映射表单集合字段中从集合中删除项目时,我做错了什么?

请尝试此操作

foreach ($quoteItem->getQuoteItemAdditionalWorks() as $existingAdditionalWorkItem) 
{
    if (false === $updatedAdditionalWorkItems->contains($existingAdditionalWorkItem))
        {
            $quoteItem->getQuoteItemAdditionalWorks()->removeElement($existingAdditionalWorkItem);
            $em->remove($existingAdditionalWorkItem);
        }
}
->removelement()工作正常。非常感谢。它需要像$quoteItem->getQuoteItemAdditionalWorks()->removeElement($existingAdditionalWorkItem)那样使用;