Symfony 如何将具有*相同*对象引用的两个对象持久化到它们中?
想象一下这个场景:我有一个实体,其中有一些相关的实体,我想按照一些逻辑进行更新Symfony 如何将具有*相同*对象引用的两个对象持久化到它们中?,symfony,doctrine-orm,Symfony,Doctrine Orm,想象一下这个场景:我有一个实体,其中有一些相关的实体,我想按照一些逻辑进行更新 public function updateRelated($foo) { foreach($foo->getBars() as $bar) { //modify bar attributes based on some logic $this->entity_manager->persist($bar); //entity manager was correctly insta
public function updateRelated($foo) {
foreach($foo->getBars() as $bar) {
//modify bar attributes based on some logic
$this->entity_manager->persist($bar); //entity manager was correctly instantiated
}
}
$foo
就是这样组成的对象
public function retrieveFoo() {
$foo = new Foo();
$bar = new Bar();
$foobar = $this->entity_manager->getRepository('MyProject:FooBar');
$bar->setFooBar($fooBar);
$foo->setBar($bar);
return $foo;
}
这个retrieveFoo()
函数的调用次数比我调用updateRelated()
的次数要多(使用foreach调用检索到的foo
对象,如下所示)
不幸的是,一些bar
对象-call it-foo1
与其他bar
对象-call it-foo2
具有相同的fooBar
对象,这会把事情搞得一团糟,因为当我使用foo2
对象返回updateAlted()
时,我已经保存了$bar
,这给了我以下错误
捕获到异常:类型为的实体
MyApplication\Entity\Bar
通过外国实体拥有身份
然而,MyApplication\Entity\FooBar
此实体本身没有标识。你必须打电话
EntityManager#persist(),并确保
标识符是在尝试持久化之前生成的
“MyApplication\Entity\Bar”。
在插入后生成ID的情况下(例如MySQL自动增量或
这意味着您必须调用EntityManager#flush()
在两个持久化操作之间
当然,如果我对各种fooBar
对象执行spl\u object\u has()
那个么,有一个额外的问题,在实体管理器管理的对象persist()
之后会发生什么
顺便说一句,我想再次获取fooBar
对象将是一个解决方案,但我如何告诉entity manager(在这种情况下是存储库)给我另一个对象,因此,基本上,从db中重新提取它或复制它并开始管理?为了避免出现这些问题,我想,我会利用Foo和Bars之间的多通关系,如果在实体的关系中使用“cascade persist”,我只会使用Foo对象来重新查看和更新内部的Bars,这是由原则自动完成的
public updateFooRelated($foo_object_array) {
foreach($foo_object_array as $foo) {
$this->updateRelated($foo);
}
}