【发布时间】:2016-10-04 17:11:28
【问题描述】:
我希望这是一个直截了当的过程,但似乎 Doctrine 并不真正喜欢通过 ID 链接实体的想法。
我打算做的只是通过将一些字段从表传送到新表来规范化表,而不是在原始表中添加新的引用字段来保存新对应记录的 ID,确保新的子表中的记录将具有与其父行相同的 ID。
这是我所拥有的一个例子:
一个 User 实体,带有注释字段 $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 和 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。
【问题讨论】:
-
生命太短暂,不必担心这些事情。将 UserDetail::id 定义为您的基本 autoinc 主键,然后添加一个 user_id 列以用作对用户的引用。而且我知道。您想让它们保持同步并且没有额外的数据库列,但这真的很重要吗?使用 Doctrine 时,认为对象而不是数据库,生活会很美好。
-
@Cerad 大声笑,不能再同意了,但不幸的是,在这个应用程序中,我们的团队(公司)不负责数据库,并且由于还有其他消费者,所以包括附加列是不可能的(基于 Java)可以更轻松地处理此类场景
-
我已经看到这个问题被问了几次,但从未见过开箱即用的解决方案。应该能够实现您自己的自定义 id 生成器。尚未找到任何关于此的最新教程,但您可以从这里开始:groups.google.com/forum/#!topic/doctrine-user/GxXAO3-g4vo
-
谢谢@Cerad,这里也一样,会看链接,如果能想出答案就留下答案
标签: php orm doctrine-orm one-to-one