2016-01-14 24 views
1

我有Budget,BudgetItemProduct實體。 A Budget有一個BudgetItem列表,其中有一個或多個Products。我試圖從this tutorial之後刪除這些以前添加的產品的列表。當我嘗試從BudgetItem列表中刪除現有的Product時,我可以看到我的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->的flush()'實際執行更改。堅持只將實體添加到隊列中。 – Artamiel

+0

@Artamiel成功!不僅如此,我還必須從'updateProductQtd'內刪除'foreach'。我以爲我不必這樣做,因爲在這些服務中,我已經有了一個'flush'。 – GabrielMF

回答

1

我不得不從updateProductQtd()方法裏面取出foreach循環,並添加$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'); 
}