1
我有Budget
,BudgetItem
和Product
實體。 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()
));
}
你應該叫'$ EM->的flush()'實際執行更改。堅持只將實體添加到隊列中。 – Artamiel
@Artamiel成功!不僅如此,我還必須從'updateProductQtd'內刪除'foreach'。我以爲我不必這樣做,因爲在這些服務中,我已經有了一個'flush'。 – GabrielMF