想象一下这种情况:我有一个实体,其中有一些我想要更新的相关实体遵循一些逻辑。
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中重新获取它它的副本开始管理?
答案 0 :(得分:0)
为了避免出现这些问题,我会利用你在Foo和Bars之间的ManyToOne关系,我假设,并且只使用Foo对象来恢复和更新内部的条形,如果你使用的话,这是由教条自动完成的在您的实体关系中“级联持续存在”。