gpt4 book ai didi

mysql - Symfony - 来自 ArrayColletion 的项目被删除,但仍显示在列表中

转载 作者:行者123 更新时间:2023-11-28 23:39:29 25 4
gpt4 key购买 nike

我有 BudgetBudgetItemProduct 实体。 Budget 有一个 BudgetItem 列表,其中有一个或多个 Products。我正在尝试删除 this tutorial 之后这些先前添加的产品的列表。 .当我尝试从 BudgetItem 列表中删除现有的 Product 时,我可以看到我的 Budget 的总价已经减少了总金额我已删除该特定 Product,但它并未从 Budget 实体中的列表中删除。

首先,让我告诉你他们的关系:

预算:

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

预算项:

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

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

现在,根据文档,BudgetController 中的 editAction 执行操作:

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()
));
}

最佳答案

我必须从 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');
}

关于mysql - Symfony - 来自 ArrayColletion 的项目被删除,但仍显示在列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34783488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com