У меня есть 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()
));
}
Вы должны позвонить '$ em-> вровень()' на самом деле выполните изменения. Сохранение только добавляет объект в очередь. – Artamiel
@ Артамиэль Успех! Не только это, но мне пришлось удалить «foreach» изнутри «updateProductQtd». Я думал, что мне не приходилось, потому что внутри этих методов из этих сервисов у меня уже есть «флеш». – GabrielMF