删除连接表中的行"多对多"单向关系

时间:2014-09-17 08:19:10

标签: php symfony doctrine many-to-many

我有两个实体:站点和语言处于“多对多”关系,其中站点是所有者方:

网站实体:

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'));
    }

1 个答案:

答案 0 :(得分:0)

我找到了解决方案:我必须在删除我的Site对象之前刷新我的实体

在我的deleteAction中:

[...]

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

$entityManager->flush();

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