如何将两个具有*相同*对象引用的对象持久化到它们中?

时间:2013-10-24 09:25:30

标签: 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 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个对象,如下所示。)

public updateFooRelated($foo_object_array) {
 foreach($foo_object_array as $foo) {
  $this->updateRelated($foo);
 }
}

不幸的是,一些bar个对象 - 调用它 - foo1具有与其他fooBar个对象相同的bar个对象 - 称之为 - foo2和事情搞得一团糟,因为当我使用updateRealted()对象返回foo2时,我已经坚持$bar,这给了我以下错误

  

捕获异常:类型的实体   MyApplication的\实体\酒吧   通过外国实体拥有身份   但是,MyApplication \ Entity \ FooBar   这个实体本身没有身份。你必须打电话   EntityManager#persist()在相关实体上并确保一个   在尝试持久化之前生成了标识符   'MyApplication的\实体\酒吧'。   在插入ID生成的情况下(例如MySQL自动增量或   PostgreSQL SERIAL)这意味着你必须调用EntityManager #flush()   在两个持续的操作之间。

当然,如果我在各种spl_object_has()对象上做fooBar我得到的,可预测的,其中一些是同一个对象。

那么,奖金问题,对于实体经理管理对象会发生什么?{/ 1}?


顺便说一下,我想再次获取persist()对象将是一个解决方案,但我怎么能告诉实体管理器(在这种情况下是存储库)给我另一个对象,所以,基本上,从db或make中重新获取它它的副本开始管理?

1 个答案:

答案 0 :(得分:0)

为了避免出现这些问题,我会利用你在Foo和Bars之间的ManyToOne关系,我假设,并且只使用Foo对象来恢复和更新内部的条形,如果你使用的话,这是由教条自动完成的在您的实体关系中“级联持续存在”。