$bar = new Bar();
$foo = $entity->getFoo();
$bar->setFoo($foo);
$em->persist($bar);
$em->flush();
我获得以下消息
通过关系找到了一个新的实体[....]
通过在网上阅读,我认为如果从两个不同的实体管理器中获取两个对象,一个管理员将不知道从其他管理器获取的实体。 从那以后我进入了一个“db hook”(postPersist),我从DIC注入了经理 ,我试图在协议中改变我的代码:
$bar = new Bar();
$foo_id = $entity->getFoo()->getId();
$foo = $em->getRepository('MyBundleName:Foo')->findOneBy(array('id'=>$foo_id));
$bar->setFoo($foo);
$em->persist($bar);
$em->flush();
但没有改变。
有人能指出我正确的方向吗,最重要的是,解释一下这里发生了什么?
我已经迁移了db钩子之外的所有代码,并且我已经创建了一个新服务,它将执行几乎相同的钩子,但必须在flush()
之后显式调用。但是,没有任何改变。我还试图在实体管理器上使用spl_obj_hash
来检索有关将对象刷新到db的实体管理器的信息,以及将从db检索$foo
并尝试持久化$bar
的“其他”的信息。 }。
这是结果:
SPL_OBJ ENTITY MANAGER - 1: 0000000021770e03000000001eda54f7
SPL_OBJ ENTITY MANAGER - 2: 0000000021770e03000000001eda54f7
如果我没错,那么它们就是同一个实体管理器对象。实际上我很困惑......
<小时/>
我找到了一个可以完成工作的“代码组合”,但我仍然对此感到困惑。
如果我使用第一段代码(从$foo
本身检索$entity
)并仅刷新$bar
,则错误仍然存在。
如果我使用第二段代码(从实体管理器中检索$foo
)并仅保留$bar
,则一切正常(如果我在没有参数的情况下调用$flush()
,则很明显,问题是还在那里)
答案 0 :(得分:4)
我有同样的问题并解决了,我发布了它,因为我还没有看到它在任何地方提到过它可能对某人有帮助。
我有一个解析数据和服务的服务坚持实体,服务于我实体管理器和服务器。子实体。我开始持续存在相同的错误。使用merge()
没有帮助,因为它只是引发了我"A managed dirty+entity [...]"
错误。
经过一番挖掘后,似乎就Doctrine而言,我提供服务的实体来自不同的实体管理器,所以如果你使用它继续存在,你实际上必须从服务中的实体管理器获取实体
答案 1 :(得分:1)
我通过删除清除来修复我的
$这 - &GT; getDoctrine() - &GT; getManager() - &GT;清除();
答案 2 :(得分:0)
我不确定,因为我之前从未遇到过此问题,现在我无法复制它。但我会给你一些我会尝试的选择:
如果两个实体管理器使用相同的数据库,您可以将实体合并(http://docs.doctrine-project.org/en/2.0.x/reference/working-with-objects.html#merging-entities)到另一个实体管理器中。在这种情况下,看起来像这样:
$em->merge($foo);
这可确保实体$foo
由您的实体管理员管理。
另外,请记住postPersist在数据库操作之后执行。如果您以prepersist方法尝试修改代码,我认为您有更好的机会。
正如文件所说:
prePersist - The prePersist event occurs for a given entity before the respective
EntityManager persist operation for that entity is executed.
postPersist - The postPersist event occurs for an entity after the entity has
been made persistent. It will be invoked after the database insert
operations. Generated primary key values are available in the
postPersist event.
可在此处找到完整文档:http://docs.doctrine-project.org/en/2.0.x/reference/events.html#lifecycle-events
试试这个,让我知道结果
答案 3 :(得分:0)
尝试:$ em-&gt;合并($ bar);
$bar = new Bar();
$foo = $entity->getFoo();
$bar->setFoo($foo);
$em->merge($bar);
$em->flush();
[1] Doctrine - A new entity was found through the relationship
答案 4 :(得分:-4)
从你的代码中不太清楚,但我认为你创建了一个新的$ foo,但是你不保存它以保存$ bar。 试试这个:
$em->persist($foo);
$em->flush();
$bar->setFoo($foo);
$em->persist($bar);
$em->flush();
通常,您可以通过在实体关联上使用cascade = persist来解除此问题。