Doctrine2尝试插入而不是仅仅引用

时间:2016-12-14 22:54:46

标签: symfony doctrine-orm

我只是从数据库中获取一个实体(行):

$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方法,但这次错误消失但外键字段为空。

更新2:

我做了Side OwningSide Inverse级联所有。这样,如果我合并$em->merge($one)它就可以了。但是,我不知道这是否正确。

2 个答案:

答案 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中,否则你将采用不同的方式。如果是这样的话,请告诉我们。