哇,这很奇怪:
$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 hooks 之外的所有代码,并且我创建了一个新服务,它将执行与 hooks 几乎相同的事情,但必须在之后显式调用flush()
非常奇怪,但是没有任何改变。我还尝试使用spl_obj_hash
实体管理器来检索有关将对象刷新到数据库中的实体管理器和$foo
将从数据库中检索并尝试持久化的“其他”的信息$bar
。这是结果:
SPL_OBJ ENTITY MANAGER - 1: 0000000021770e03000000001eda54f7
SPL_OBJ ENTITY MANAGER - 2: 0000000021770e03000000001eda54f7
如果我没记错的话,它们是同一个实体管理器对象。其实我很迷茫...
更新 - 工作代码
我找到了一个可以完成工作的“代码组合”,但我仍然对此感到很困惑。
如果我使用第一段代码(其中$foo
从$entity
自身检索)并且仅刷新$bar
,错误仍然存在。
如果我使用第二段代码($foo
从实体管理器中检索到)并且仅持久化$bar
,则一切正常(显然,如果我$flush()
在没有参数的情况下调用,问题仍然存在)