2012-09-05 135 views
1

一个用户可能只有一个项目或没有项目。 (1-1..0的关系)与doctrine和symfony2嵌入形式的1到1..0关系

我正试图在symfony2中使用教义来实现。

我已经完成了1对1的关系,它非常简单。但是我怎样才能指定这样一个原则:当我想创建一个用户时,该项目可以为空? (而不是插入新行和刚刚离开id_item空)

这是我有:

user.orm.yml文件

oneToOne: 
    userItem: 
    targetEntity: SOA\AXBundle\Entity\Items 
    cascade: ["remove", "persist"] 
    joinColumn: 
     name: id_item   
     referencedColumnName: id   
     nullable: true 

和当然,我创建ItemsTypeForm类,在我userstypeform类添加类型:

// UsersTypeForm Class 
    ->add('userItem', new \SOA\AXBundle\Form\ItemsTypeForm()) 

控制器动作是这样的,

public function addUserAction(Request $request) { 

    $user = new User(); 

    $form = $this->createForm(new UseType(), $user); 

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

    $form->bindRequest($request); 

    if ($form->isValid()) { 

     $em = $this->getDoctrine()->getEntityManager(); 
     $em->persist($user); 
     $em->flush(); 

     return $this->redirect($this->generateUrl('homepage')); 
    } 
    } 

} 

当我添加一个新用户时,一切都很顺利。插入用户以及项目。但是,当我尝试添加它没有项目(用户项目字段为空),我得到以下错误的用户:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be null 

它试图插入项目,空值。

虽然我可以与1对1的关系生活,但我想了解如何创建1对1..0的关系。

+0

你能展示你如何坚持数据吗? – Cyprian

+0

我添加了控制器操作 – Rohitha

回答

0

数据库模式是没问题的(你可以检查一下,如果你直接看你的数据库在用户表定义,我敢肯定你可以使用null作为“item_id”字段)。

问题是当你填写你的表单并提交它时,Symfony创建Item对象,并将每个字段设置为null(因为表单中与项目有关的每个字段都是空的)。您必须以某种方式告诉如果每个字段都为空,那么框架不应该保留Item对象。在我看来,实现这一点最好的方法是使用DataTransformer。在变压器一般

http://symfony.com/doc/2.0/cookbook/form/data_transformers.html

::您检查reverseTransform如果每一个领域是空的,如果是,那么你返回Item对象的空代替:

你可以在这里读到它。