Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 如何将具有*相同*对象引用的两个对象持久化到它们中?_Symfony_Doctrine Orm - Fatal编程技术网

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);
 }
}