这是关于当我试图将一条记录插入一个关联实体时与教义的问题。以下是对问题的简单描述。学说:设置外交关系
我有两个表,我们称它们为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()
吗?自动正如@lordrhodos指出,宣告场
$twoId
是错误的,因为学说将创建它,而无需一个:(PhpStorm甚至不承认它)
我们需要看到的代码模型。我想知道为什么你在'One'实体上有一个'setTwoId()'函数。关于你的第二个问题:在entityManager上使用引用需要知道id。它将通过代理类获取对象,并在您尝试访问该类的其他属性时尽快将其保存,因此可以使用它来引用它。 – lordrhodos
你是对的@主持人,有'setTwoId'功能是一个坏主意。感谢帮助。 – user3429660