我希望这是一个直接的过程,但似乎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。
答案 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;
...
}