Доктрина Symfony: удалить все отношения ManyToMany

У меня есть отношения ManyToMany между двумя объектами (ClientProject & Тур), который на самом деле работает, за исключением одного случая. Когда я хочу очистить все отношения между этими объектами, это не работает, и база данных не обновляется соответственно.

ClientProject.php

/**
* @ORM\ManyToMany(targetEntity="Tour", inversedBy="clientProjects")
* @ORM\JoinTable(
*  name="client_projects_tour_items",
*  joinColumns={
*      @ORM\JoinColumn(name="client_project_id", referencedColumnName="id")
*  },
*  inverseJoinColumns={
*      @ORM\JoinColumn(name="tour_id", referencedColumnName="id")
*  }
*  )
*/
protected $tourItems;public function removeTourItem(\SharedBundle\Entity\Tour $tourItem)
{
$this->tourItems->removeElement($tourItem);
}

Tour.php

public function removeClientProject(\SharedBundle\Entity\ClientProject $clientProject)
{
$this->clientProjects->removeElement($clientProject);
}

Рабочий пример:

  1. До обновления:
    • Тур 1 / КлиентПроект 3
    • Тур 1 / КлиентПроект 4
  2. Действие: удалить связь между Туром 1 и ClientProject 4
  3. После обновления:
    • Тур 1 / КлиентПроект 3

Неудачный пример:

  1. До обновления:
    • Тур 1 / КлиентПроект 3
  2. Действие: удалить связь между Туром 1 и ClientProject 3
  3. После обновления:
    • Тур 1 / КлиентПроект 3

Действие контроллера

public function editClientProjectAction($id, Request $request)
{
if (!$request->isXmlHttpRequest()) {
return $this->redirectToRoute('contact');
}

$clientProject = $this->getDoctrine()->getRepository(ClientProject::class)->find($id);
if(!$clientProject) {
return new JsonResponse(array('redirect' => $this->generateUrl('contacts')));
}

$form = $this->createForm(ClientProjectFormType::class, $clientProject, array(
'action' => $this->generateUrl('edit-client-project', array('id' => $id))
));
$form->setData($clientProject);
if ($request->isMethod('POST')) {
$form->submit($request->request->get($form->getName()), false);
if($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($clientProject);
$em->flush();

return new JsonResponse(array('reloadDatatable' => 'client_project_datatable'));
} else {
return new JsonResponse(array('reload' => true));
}
}

return $this->render('@AppBundle/client-projects/edit-client-project.html.twig', [
'form' => $form->createView(),
]);
}

-2

Решение

Чтобы сделать удаление работающим, я думаю, вам нужно добавить этот код в ваши методы удаления:

# Entity/ClientProject.php
/**
* Remove tourItem
*
* @param \SharedBundle\Entity\Tour $tourItem
*/
public function removeTourItem(\SharedBundle\Entity\Tour $tourItem)
{
if (!$this->tourItems->contains($tourItem)) {
return;
}
$this->tourItems->removeElement($tourItem);
$clientProject->removeTourItem($this);
}

# Entity/Tour.php
/**
* Remove clientProject
*
* @param \SharedBundle\Entity\ClientProject $clientProject
*/
public function removeClientProject(\SharedBundle\Entity\ClientProject $clientProject)
{
if (!$this->clientProject->contains($clientProject)) {
return;
}
$this->clientProjects->removeElement($clientProject);
$tourItem->removeClientProject($this);
}

Кроме того, в Tour.php файл, который вам нужно добавить эту аннотацию:

cascade={"persist", "remove"}

когда вы устанавливаете отношения.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector