删除单向关系"Many-to-many"连接表中的行



在"多对多"关系中,我有两个实体: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();

最新更新