Symfony2 - 嵌入表单擦除子数据

时间:2013-04-15 14:55:18

标签: php forms symfony doctrine

thisalso this的另一个延续:

所以,我最初能够显示一个包含BlogPost的表单,并且它是相关的评论。问题是,如果我编辑一些BlogPost信息并保存,它会清除所有我的评论,无论它们是否与 BlogPost相关。不好。

我的大多数相关代码都在上面的第二个链接中,所以我在此不再重复。但是,我会添加控制器和视图中的内容。

控制器:

public function EditBlogAction($id)
{
    $request = $this->get('request');
    $em = $this->get('doctrine')->getManager();
    $blogPost = $em->getRepository('Acme\SiteBundle\Entity\BlogPost')->find($id);

    $comments = $blogPost->getComments();

    $form = $this->createForm(new BlogPostType(), $blogPost);

    if ($request->getMethod() == 'POST') {
        $form->bind($request);

        foreach ($comments as $comment) {
            $em->persist($comment);
        }
        $em->persist($blogPost);

        $em->flush();
        $em->clear();
    }

    return $this->render('SiteBundle:Site:editblog.html.twig',array('blogpost' => $blogPost, 'form' => $form->createView()));
}

editblog.html.twig:

<form action='{{ path('_admin_blog_edit', { 'id':blogpost.getId }) }}' method='post' enctype="multipart/form-data">
    {{ form_widget(form.title) }}

    {# other blog post fields #}

    {% for comment in form.comments %}
        {{ comment.commentBody }}
    {% endfor %}
<input type="submit" />

我无法理解为什么保存BlogPost信息会删除任何评论,更不用说不属于该特定帖子的评论。

1 个答案:

答案 0 :(得分:1)

您在cascade={"all"}OneToMany之间的Comment关系上使用BlogPost

您无需手动persist随博客帖子发布的评论,因此您可以从控制器中删除以下代码(EditBlogAction()中):

foreach ($comments as $comment) {
  $em->persist($comment);
}

关于该主题的学说文档:https://doctrine-orm.readthedocs.org/en/latest/reference/working-with-associations.html?highlight=Transitive%20Persistence#transitive-persistence-cascade-operations