如何通过学说实体之间的ID建立一对一的关系

时间:2016-10-04 17:11:28

标签: php orm doctrine-orm one-to-one

我希望这是一个直接的过程,但似乎Doctrine并不喜欢通过他们的ID链接实体的想法。

我打算通过将表中的一些字段传送到新表来规范化表,而不是在原始表中添加新的引用字段来保存新的相应记录的ID,确保新的表子表中的记录与其父行具有相同的ID。

以下是我的例子:

用户实体,带有注释字段$user,用于将 UserDetail 实体中的列ID引用到自身的ID

/**
 * @ORM\Table(name="user", options={"collate"="utf8_general_ci", "charset"="utf8", "engine"="InnoDB"})
 * @ORM\Entity
 */
class User extends Entity
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id

     /**
      * @ORM\OneToOne(targetEntity="UserDetail", cascade={"persist"})
      * @ORM\JoinColumn(name="id", referencedColumnName="id", nullable=true)
      */
     private $userDetail;

     ...
}

这是 UserDetail ,其ID已删除@GeneratedValue

/**
 * @ORM\Table(name="user_detail", options={"collate"="utf8_general_ci", "charset"="utf8", "engine"="InnoDB"})
 * @ORM\Entity
 */
class UserDetail extends Entity
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     */
    private $id;

    ...
}

此时我的期望是能够做到这样的事情:

$user = new User();
$userDetail = new UserDetail();

$user->setUserDetail($userDetail)

$entityManager->persist($user);
$entityManager->flush();

并将用户 user_detail 表中的两条记录保持为相同的 ID,但实际情况是,没有为其定义任何策略UserDetail的标识符,学说将抱怨缺少的ID Entity of type UserDetail is missing an assigned ID for field 'id'.

当然可以手动和多次通话来完成工作

$user = new User();
$entityManager->persist($user);
$entityManager->flush();

$userDetail = new UserDetail();
$userDetail->setId($user->getId)    
$user->setUserDetail($userDetail)

$entityManager->persist($user);
$entityManager->flush();

但我仍然希望有一个正确的配置(注释)可以帮助我避免这些额外的步骤,并通过实体的ID将处理一对一的关系留给Doctrine。

1 个答案:

答案 0 :(得分:1)

这是未经测试的,但根据文档(http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html),我认为以下内容可能有效:

    /**
     * @ORM\Table(name="user_detail", options={"collate"="utf8_general_ci", "charset"="utf8", "engine"="InnoDB"})
     * @ORM\Entity
     */
    class UserDetail extends Entity
    {
        /**
         * @var integer
         *
         * @ORM\OneToOne(targetEntity="User")
         * @ORM\JoinColumn(name="id", referencedColumnName="id")
         * @ORM\Id
         */
        private $user;

    ...
    }