2013-04-15 46 views
1

不過的thisalso this另一繼續:Symfony2中 - 嵌入式形式擦拭孩子的數據

所以,我能初步顯示包含博客帖子形式和它相關的評論。問題是,如果我編輯一些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" /> 

我不明白爲什麼節約的博文信息將消滅任何評論,我們不屬於那個特定職位單獨評論。

+1

從你的第二篇文章中,我看到你在'Comment'關係上使用'cascade = {「all」},orphanRemoval = true'。如果你在你的控制器中刪除'$ em-> persist($ comment)'並用'cascade = {「persist」}'替換'cascade = {「all」}'? – cheesemacfly

+0

太棒了,做到了!讓你的評論一個答案,我會upvote /標記爲已解決 –

+0

在我發佈答案之前,如果你保留'cascade = {「all」}'? – cheesemacfly

回答

1

您在和BlogPost之間的OneToMany關係上使用cascade={"all"}

你並不需要手動張貼着您的博客後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