Удалить строку в соединительной таблице в разделе «Многие ко многим» однонаправленное отношение

У меня есть две сущности: Сайт и Язык в отношениях «многие ко многим», в которых Сайт является стороной владельца:

Сущность сайта:

class Site
{
[...]

/**
* @ORM\ManyToMany(targetEntity="Language", cascade={"persist"})
* @ORM\JoinTable(name="site_language")
*/
protected $languages;

/**
* Initialisation
*/
public function __construct()
{
$this->languages = new ArrayCollection();
}

public function getLanguages()
{
return $this->languages;
}

public function setLanguages($languages)
{
$this->languages = $languages;

return $this;
}

public function removeLanguage($language)
{
$this->languages->removeElement($language);
}
}

и ничего о сущности сайта в языковой сущности, потому что, как я уже говорил, сайт является владельцем в этом однонаправленном отношении.

Таким образом, Doctrine сгенерировала таблицу соединений «site_language» с «site_id» и «language_id» в качестве столбцов.

Но у меня есть проблема при удалении сайта.

По логике вещей, когда сайт удаляется, он должен удалять в объединяющей таблице только строку, соответствующую «site_id» и «language_id» этого сайта.

Пример : У меня есть сайт с идентификатором «10». Этот сайт имеет 2 языка, FR (id = 1) и EN (id = 2). Итак, в объединительной таблице «site_language» есть 2 строки:

site_id || LANGUAGE_ID

10 || 1

10 || 2

Поэтому, когда я хочу удалить этот сайт, он должен удалить эти 2 строки в этой таблице.
Но у меня ничего не получается. Мне удалось удалить язык только из таблицы «language», но это не хорошо …

Это мой deleteAction в контроллере сайта:

public function deleteSiteAction($siteId, Request $request)
{
$entityManager = $this->getDoctrine()->getManager();
$site = $this->get('doctrine')
->getRepository('BackBundle:Site')
->find($siteId);

if (!$site) {
throw $this->createNotFoundException('Unable to find Site entity.');
}

$originalLanguage = new ArrayCollection();

foreach ($site->getLanguages() as $language) {
$originalLanguage->add($language);
}

$deleteForm = $this->createDeleteForm($siteId);
$deleteForm->handleRequest($request);

if ($deleteForm->isValid()) {
foreach($originalLanguage as $language) {
if($site->getLanguages()->contains($language) == true) {
$site->removeLanguage($language);
// $entityManager->remove($language); -> **if I keep this line it delete the language in the "language" table**
}
}

$entityManager->remove($site);
$entityManager->flush();
$this->get('session')->getFlashBag()->add('success', 'Le site a été supprimé');

} else {
$this->get('session')->getFlashBag()->add('danger', 'Une erreur est intervenue lors de la suppression');
}

return $this->redirect($this->generateUrl('site_list'));
}

0

Решение

Я нашел решение: я должен очистить свою сущность перед удалением объекта Site

В моем deleteAction:

[...]

foreach($allLanguage as $language) {
$site->removeLanguage($language);
}

$entityManager->flush();

$entityManager->remove($site);
$entityManager->flush();
0

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

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

По вопросам рекламы [email protected]