在"多对多"关系中,我有两个实体:Site和Language,Site是所有者:
站点实体:
class Site
{
[...]
/**
* @ORMManyToMany(targetEntity="Language", cascade={"persist"})
* @ORMJoinTable(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);
}
}
语言实体中没有关于Site实体的任何内容,因为正如我之前所说,Site是这种单向关系中的所有者。
因此,Doctrine生成了一个联接表"site_language",其中"site_id"one_answers"language_id"为列。
但当我删除一个网站时,我遇到了一个问题。
从逻辑上讲,当一个站点被删除时,它应该只删除联接表中与该站点的"Site_id"one_answers"language_id"对应的行。
示例:我有一个id为"10"的网站。本网站有两种语言,法语(id=1)和英语(id=2)。因此,在联接表"site_language"中,有2行:
site_id|language_id
10||1
10||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'));
}
我找到了解决方案:在删除我的站点对象之前,我必须刷新我的实体
在我的委托人行动:
[...]
foreach($allLanguage as $language) {
$site->removeLanguage($language);
}
$entityManager->flush();
$entityManager->remove($site);
$entityManager->flush();