我有两个实体:站点和语言处于“多对多”关系,其中站点是所有者方:
网站实体:
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”对应的行。
示例:我的网站ID为“10”。本网站有2种语言,FR(id = 1)和EN(id = 2)。所以在联接表“site_language”中,有两行:
site_id || LANGUAGE_ID
10 || 1
10 || 2
因此,当我想删除此站点时,它应删除此表中的这2行。 但我没有成功。我只是成功删除了“语言”表中的语言,但这并不好......
这是我在站点控制器中的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 :(得分:0)
我找到了解决方案:我必须在删除我的Site对象之前刷新我的实体
在我的deleteAction中:
[...]
foreach($allLanguage as $language) {
$site->removeLanguage($language);
}
$entityManager->flush();
$entityManager->remove($site);
$entityManager->flush();