我只是从数据库中获取一个实体(行):
$one = $em->getRepository()->find(1);
并尝试插入另一个具有$one
外键的实体:
for($i=0; $i<=100; $i++) {
$two = new TwoEntity();
$two->setOne($one); // as you can see $one is just a foreign key. Referenced.
$two->setSomething(true);
$em->persist($two);
...
// when each 20th cycle flush them. and clear.
$em->flush();
$em->clear();
}
注意:我使用Doctrine2的批量插入方式。我只是将代码最小化,以便更简单地解释我想要做什么。
而不是引用$one
,Doctrine尝试重新插入$one
。它给出了持久性异常,如果我坚持$one
,它只是试图一次又一次地插入$one
。错误:A new entity was found through the relationship...
如何引用$one
并仅批量插入$two
?
更新:我在$one->addTwo($two)
上尝试了$one
方法,但这次错误消失但外键字段为空。
我做了Side Owning
和Side Inverse
到级联所有。这样,如果我合并$em->merge($one)
它就可以了。但是,我不知道这是否正确。
答案 0 :(得分:1)
你做$em->clear();
所以{Doc = 1}}在Doctrine中不再引用$one
。
明确方法的Docblock说:
Clears the ObjectManager. All objects that are currently managed by this ObjectManager become detached.
只需删除$em->clear();
或使用此类$em->clear('TwoEntity');
答案 1 :(得分:0)
这是不正确的:
$two->setOne($one); // as you can see $one is just a foreign key. Referenced.
你需要做的是这样的事情:
$two->setOne( $one->getId() );
或类似的东西。换句话说,获取引用ID。现在,您正在设置对象,而不是标识符。 除非你真的想要将对象添加到新的实体$ 2中,否则你将采用不同的方式。如果是这样的话,请告诉我们。