教义2-通过关系发现了一个新实体[...]

Don*_*sto 2 orm symfony doctrine-orm

哇,这很奇怪:

$bar = new Bar();

$foo = $entity->getFoo(); 
$bar->setFoo($foo);

$em->persist($bar); 
$em->flush();
Run Code Online (Sandbox Code Playgroud)

我收到以下消息

通过关系发现了一个新实体[....]

通过在网上阅读,我理解,如果从两个不同的实体管理器中获取两个对象,那么一个经理将不知道从另一个管理器中获取的实体。从这里开始,我进入了“ 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();
Run Code Online (Sandbox Code Playgroud)

但什么都没有改变。

有人能指出我正确的方向,最重要的是,解释一下这里发生了什么吗?


更新

我已经将所有代码迁移到db hooks之外,并且创建了一个新服务,该服务将执行与hooks几乎相同的事情,但是必须在flush()奇怪之后显式调用。但是,这没有什么改变。我还尝试过使用spl_obj_hash实体管理器来检索有关实体管理器的信息,该实体管理器将对象刷新到db中,并将“另一个”刷新到$foodb中并尝试持久化$bar。结果如下:

SPL_OBJ ENTITY MANAGER - 1: 0000000021770e03000000001eda54f7
SPL_OBJ ENTITY MANAGER - 2: 0000000021770e03000000001eda54f7
Run Code Online (Sandbox Code Playgroud)

如果我没看错,它们是相同的实体管理器对象。其实我很困惑


更新-工作代码

我已经找到了可以完成这项工作的“代码组合”,但是我对此仍然很困惑。

如果我使用第一个代码段($foo$entity自身中检索到的代码)并仅刷新$bar,则错误仍然存​​在。

如果我使用第二段代码($foo从实体管理器中检索到)并且仅持久存在$bar,则所有代码都可以正常工作(如果我$flush()不带参数调用,问题仍然存在)

Tom*_*oms 5

我遇到了同样的问题,并解决了它,我将其发布,因为我没有在任何地方看到它,它可能会帮助别人。

我有一个解析数据并将其持久化到实体的服务,该服务向我提供了entityManager和子实体。而且我开始对持久性有同样的错误。使用merge()并没有帮助,因为它只是使我"A managed dirty+entity [...]"出错。

经过一番挖掘后,就Doctrine而言,似乎我正在提供服务的实体来自不同的entityManager,因此,如果要使用它来持久化,实际上必须从服务内的entityManager获取实体。