【问题标题】:Symfony2 form and Doctrine OneToOne relationshipSymfony2 形式与 Doctrine OneToOne 的关系
【发布时间】:2012-04-05 23:33:09
【问题描述】:

我有 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"
    }

【问题讨论】:

    标签: forms symfony doctrine-orm


    【解决方案1】:

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

    【讨论】:

    • 我删除了 avatarId 字段,但出现以下错误:Property avatarId does not exist in class Test\UserBundle\Entity\User
    • 你根本不需要它。 avatar 字段是您需要使用的。 avatar_id 列会自动处理。
    【解决方案2】:

    一些事情:

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

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

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

    还有一个关于您的 OneToOne 关系的注释,如果该列表中的多个人可以使用 Avatars,那将是 ManyToOne 关系(多个用户对一个头像,一个头像对多个用户)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 2017-06-16
      • 2016-05-14
      相关资源
      最近更新 更多