【发布时间】:2017-07-02 02:55:39
【问题描述】:
当我尝试将记录插入关联实体时,这是关于 Doctrine 的问题。以下是问题的简化描述。
我有两张桌子,我们称它们为One 和Two。表One 具有表Two 的外键,称为twoId,列two_id。字段 two_id 恰好是主键的一部分。
* @ORM\Id
* @ORM\Column(name="user_id", type="string", length=40)
*/
private $twoId;
/**
* @ManyToOne(targetEntity="[...]", inversedBy="[...]", fetch="EAGER")
* @JoinColumn(name="two_id", referencedColumnName="id", onDelete="CASCADE")
*/
private $two;
我正在尝试在表 A 中插入一条新记录。这可行:
$two = [.. read from DB ..];
$one = new One();
$one->setTwo($two);
$one->setTwoId($two->getId());
$em->persist($one);
$em->flush();
我不喜欢同时拨打setTwo 和setTwoId。此外,我不喜欢在引用 $two 记录之前阅读它。
如果我跳过setTwoId 调用,我会收到错误:[..] 类型的实体缺少为字段“twoId”分配的 ID。此实体的标识符生成策略要求在调用 EntityManager#persist() 之前填充 ID 字段。
如果我跳过setTwo 调用,我会收到错误消息:违反完整性约束:1048 Column 'two_id' cannot be null
我的问题是:
如何避免同时调用
setTwo()和setTwoId()?如果我想从
Two引用一个实体而不阅读它怎么办?我应该使用$em->getReference()吗? (PhpStorm 甚至都认不出来)
【问题讨论】:
-
我们需要查看模型的代码。我想知道为什么您在
One实体上有一个setTwoId()函数。关于您的第二个问题:使用 entityManager 上的引用需要知道 id。它将通过代理类获取对象,并在您尝试访问该类的更多属性时立即对其进行水合,所以是的,您可以使用它来引用它。 -
你是对的@lordrhodos,拥有
setTwoId函数是个坏主意。感谢您的帮助。
标签: symfony doctrine-orm