当我尝试将记录插入关联实体时,这是关于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列'two_id'不能为空
我的问题是:
如何避免同时调用setTwo()
和setTwoId()
?
如果我想从Two
引用实体而不阅读,该怎么办?我应该使用$em->getReference()
吗? (PhpStorm甚至不认识它)
答案 0 :(得分:0)
如果有人犯了同样的错误:
正如@lordrhodos所指出的,声明字段$twoId
是错误的,因为Doctrine会在没有定义的情况下自动创建它。
定义:
/**
* @ManyToOne(targetEntity="[...]", inversedBy="[...]", fetch="EAGER")
* @JoinColumn(name="two_id", referencedColumnName="id", onDelete="CASCADE")
*/
private $two;
用法:
$two = [.. read from DB ..];
$one = new One();
$one->setTwo($two);
$em->persist($one);
$em->flush();