2014-12-05 94 views
3

我在Symfony2中的OneToMany嵌入表单存在持续性问题。Symfony2 OneToMany嵌入表单不保存实体

这一次,实体被保存,但没有对父类的引用。

我的表看起来像

| id | position | content | about_id | 
| 29 |  1 | test 1 |  NULL | 

我不明白为什么这about_id仍然是NULL。

我的关系:

实体公司:

class About { 
    /* 
    .... 
    */ 

    /** 
    * @ORM\OneToMany(targetEntity="AboutContent", mappedBy="about", cascade={"persist", "remove"}) 
    */ 
    private $content; 

    /** 
    * Add content 
    * 
    * @param AboutContent $content 
    * @return About 
    */ 
    public function addContent(AboutContent $content) 
    { 
     $this->content[] = $content; 

     return $this; 
    } 

    /** 
    * Remove content 
    * 
    * @param AboutContent $content 
    */ 
    public function removeContent(AboutContent $content) 
    { 
     $this->content->removeElement($content); 
    } 

    /** 
    * Get content 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function getContent() 
    { 
     return $this->content; 
    } 
} 

我的关于内容:

class AboutContent { 
    /** 
    * @ORM\ManyToOne(targetEntity="About", inversedBy="content") 
    */ 
    private $about; 

    /** 
    * Set about 
    * 
    * @param About $about 
    * @return AboutContent 
    */ 
    public function setAbout(About $about = null) 
    { 
     $this->about = $about; 

     return $this; 
    } 

    /** 
    * Get about 
    * 
    * @return About 
    */ 
    public function getAbout() 
    { 
     return $this->about; 
    } 
} 

我的控制器已经被我的CRUD自动生成:

/** 
* Creates a new About entity. 
* 
*/ 
public function createAction(Request $request) 
{ 
    $entity = new About(); 
    $form = $this->createCreateForm($entity); 
    $form->handleRequest($request); 

    if ($form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 

     $em->persist($entity); 
     $em->flush(); 

     return $this->redirect($this->generateUrl('about_show', array('id' => $entity->getId()))); 
    } 

    return $this->render('AdminBundle:About:new.html.twig', array(
     'entity' => $entity, 
     'form' => $form->createView(), 
    )); 
} 

我形式bu ilder:

$builder 
    ->add('lang', 'choice', array(
        'choices' => $this->langs, 
        'preferred_choices' => array('en'), 
     ))   ->add('media') 
    ->add('content', 'collection', array(
     'type'   => new AboutContentType(), 
     'allow_add' => true, 
     'allow_delete' => true, 
     'cascade_validation' => true 
    ), array('label'=>'Texts'))  
; 

} 

非常感谢你,如果你找到解决方案。

回答

6

大家好,我终于找到了答案。 问题并非来自我的实体或我的关系。 它来自我的表格。

在我喜欢的类型,我只是省略添加标记:'by_reference' => false

它解决一切。

为了帮助你,如果你有同样的问题,下面是我的建设者:

$builder->add(
    'aboutContents', 
    'collection', 
    [ 
     'type' => new AboutContentType(), 
     'allow_add' => true, 
     'allow_delete' => true, 
     'cascade_validation' => true, 
     'by_reference' => false, 
    ], 
    [ 
     'label' => 'Texts' 
    ] 
); 
+5

我不能相信我花了3小时这个... – AlexisWbr 2016-06-03 08:32:40

+0

男人,2年后你已经救了我的一天.... – skytorner 2017-02-21 17:11:10

4

你的新AboutContent对象不知道创建About实体,因为形式:
- 运行在About对象,
addContent方法 - 不能在AboutContent运行setAbout

您必须更新拥有方的关联字段(AboutContent)才能保持关系。

看看Association Updates的定义。

在您的代码:
- 拥有方是AboutContent实体(因为它关系到About
- 反侧是About实体

所以addContent方法,你必须添加AboutContent设置About

class About { 
    //... 

    /** 
    * Add content 
    * 
    * @param AboutContent $content 
    * @return About 
    */ 
    public function addContent(AboutContent $content) 
    { 
     $this->content[] = $content; 

     $content->setAbout($this); // set the relation on the owning-side 

     return $this; 
    } 

    //... 
} 
+0

谢谢你,我试过,但它不会改变任何东西 – Jaycreation 2014-12-08 06:49:56