У меня есть две сущности: Сайт и Язык в отношениях «многие ко многим», в которых Сайт является стороной владельца:
Сущность сайта:
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'));
}
Я нашел решение: я должен очистить свою сущность перед удалением объекта Site
В моем deleteAction:
[...]
foreach($allLanguage as $language) {
$site->removeLanguage($language);
}
$entityManager->flush();
$entityManager->remove($site);
$entityManager->flush();
Других решений пока нет …