嵌入式表格中的1到1..0关系,带有doctrine和symfony2

时间:2012-09-05 18:06:21

标签: php symfony doctrine doctrine-orm

一个用户可能只有一个项目或没有。 (1-1..0关系)

我正在尝试用doctrine在symfony2中实现这一目标。

我已经完成了一对一的关系,这很简单。但是,如何指定当我想创建用户时,该项可以为null? (而不是插入新行,只留下id_item null)

这就是我所拥有的:

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())

Controller Action就是这样,

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的关系。

1 个答案:

答案 0 :(得分:0)

数据库模式是可以的(你可以检查一下,如果你在User表定义中直接查看你的数据库,我很确定你可以为“item_id”字段使用null)。

问题是当你填写表单并提交它时,Symfony创建Item对象,每个字段都设置为null(因为表单中与item相关的每个字段都是空的)。你必须告诉我,如果每个字段都为null,那么框架不应该持久化Item对象。在我看来,实现这一点最好的方法是使用DataTransformer。

你可以在这里阅读:

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

通常在transformer :: reverseTransform中检查每个字段是否为空,如果是,则返回null而不是Item对象。