2016-01-14 3 views
1

У меня есть Budget, BudgetItem и Product объектов. A Budget имеет список BudgetItem, который имеет один или несколько Products. Я пытаюсь удалить список этих ранее добавленных продуктов после this tutorial. Когда я пытаюсь удалить существующий Product из списка BudgetItem, я могу видеть, что общая стоимость моего Budget уменьшила общую сумму для этого конкретного Product. Я удалил, но не удален из списка в объекте Budget.Symfony - Элементы из ArrayColletion удаляются, но все еще отображаются в списке

Во-первых, позвольте мне показать вам свои отношения:

Budget:

/** 
* @var integer 
* 
* @ORM\OneToMany(targetEntity="BudgetItem", mappedBy="budget", cascade={"persist"}, orphanRemoval=true) 
*/ 
private $items; 

BudgetItem:

/** 
* @ORM\ManyToOne(targetEntity="Product") 
* @ORM\JoinColumn(nullable=false) 
*/ 
private $product; 

/** 
* @ORM\ManyToOne(targetEntity="Budget", inversedBy="items") 
* @ORM\JoinColumn(nullable=false) 
*/ 
private $budget; 

Теперь editAction из моих BudgetController, делая операцию, в соответствии с документация:

public function editAction($id, Request $request) 
{ 
    $em = $this->getDoctrine()->getManager(); 
    $budget = $em->getRepository('CDGBundle:Budget')->find($id); 

    $products = new ArrayCollection(); 

    foreach ($budget->getItems() as $item) { 
     $products->add($item); 
    } 

    $form = $this->createForm(BudgetType::class, $budget); 
    $form->handleRequest($request); 

    if ($form->isValid()) { 
     if ($this->get('cdg.budget_updater')->updateProductQtd($budget)) { 
      // Here \/ 
      foreach ($products as $product) { 
       if (!$budget->getItems()->contains($product)) { 
        $product->getBudget()->removeItem($product); 
        $em->persist($product); 
       } 
      } 
      // Here /\ 

      $this->get('cdg.budget_updater')->updatePaymentDates($budget); 
      $this->addFlash('notice', 'Orçamento de \'' . $budget->getCustomer() . '\' alterado com sucesso'); 
     } else { 
      $this->addFlash('notice', 'Material(is) esgotado(s). Reveja o seu estoque.'); 
     } 

     return $this->redirectToRoute('budgets'); 
    } 

    return $this->render('budget/edit.html.twig', array(
     'form' => $form->createView(), 
     'title' => 'Editar orçamento de ' . $budget->getCustomer() 
    )); 
} 
+0

Вы должны позвонить '$ em-> вровень()' на самом деле выполните изменения. Сохранение только добавляет объект в очередь. – Artamiel

+0

@ Артамиэль Успех! Не только это, но мне пришлось удалить «foreach» изнутри «updateProductQtd». Я думал, что мне не приходилось, потому что внутри этих методов из этих сервисов у меня уже есть «флеш». – GabrielMF

ответ

1

мне пришлось удалить петлю foreach изнутри updateProductQtd() метода и добавить $em->flush(), как сказал @Artamiel, после цикла:

if ($form->isValid()) { 
    foreach ($products as $product) { 
     if (!$budget->getItems()->contains($product)) { 
      $product->getBudget()->removeItem($product); 
      $em->persist($product); 
     } 
    } 
    $em->flush(); 

    if ($this->get('cdg.budget_updater')->updateProductQtd($budget)) { 
     $this->get('cdg.budget_updater')->updatePaymentDates($budget); 
     $this->addFlash('notice', 'Orçamento de \'' . $budget->getCustomer() . '\' alterado com sucesso'); 
    } else { 
     $this->addFlash('notice', 'Material(is) esgotado(s). Reveja o seu estoque.'); 
    } 

    return $this->redirectToRoute('budgets'); 
}