Symfony2形式和Doctrine OneToOne关系

时间:2012-04-05 14:42:14

标签: forms symfony doctrine-orm

我有2个实体:UserAvatar。每个用户都可以从列表中选择一个头像,所以我认为这是一个One2One单向关系。问题是当我保存表单时,数据库中的字段avatar_id始终是NULL

让我们看看代码:

class User implements UserInterface
{
    /**
     * @var int $avatarId
     * 
     * @ORM\Column(name="avatar_id", type="integer", nullable=true)
     */    
    private $avatarId;

     /**
     * @var Avatar
     * 
     * @ORM\OneToOne(targetEntity="Avatar", cascade={"persist", "remove"})
     */
    private $avatar;  

}

当我在保存之前var_dump用户对象时,字段avatarId包含Avatar对象,但不保存ID。我做错了什么?

["avatarId":"Test\UserBundle\Entity\User":private]=>
    object(Test\UserBundle\Entity\Avatar)#419 (5) {
        ["id":"Test\User\Bundle\Entity\Avatar":private]=>
            int(3)
        ["imageName":"Test\UserBundle\Entity\Avatar":private]=>
            string(14) "death-dark.jpg"
    }

2 个答案:

答案 0 :(得分:1)

您不需要avatarId字段,因为avatar字段会自动处理它。您可以使用@JoinColumn注释明确设置引用列名称。

答案 1 :(得分:1)

一些事情:

ID列通常使用以下注释生成:

/**
 * @ORM\Id @ORM\Column(type="integer")
 * @ORM\GeneratedValue
 */

这告诉ORM在创建新对象时自动生成一个值,因此当您转储对象时,它将在持久化之前具有值。

关于你的OneToOne关系的说明,如果Avatars可以被该列表中的多个人使用,那将是ManyToOne关系(许多用户对一个头像,一个头像对许多用户)。