11

我长期使用基于 SQL 查询的数据库访问级别。但现在我决定使用 ORM Doctrine2。目前,我对实体工作流程有一个概念上的误解。

最好的例子描述:

 try {
   $user = $entityManager->find('User', 1);
   $user->setName('New name');
   $entityManager->flush();
 }
 catch (...)
 {
   // !we are here: changes failed and $user-row in DB was not updated
 }

 // ...

 $user = $entityManager->find('User', 1);
 $user->setOther('Other');
 $entityManager->flush(); // <- in this request both [other] and [name] fields will be updated to DB, but only [other] update expected

在第一个代码块中,我获取了 $user 对象。更改了 [name] 并尝试保存它,但失败了。在第二个块(与第一个块无关)中,我再次获取了 $user 对象。但是 ORM 返回的链接与第一次相同的对象。所以这个对象已经改变了 [name] 属性。在第二个块的最后一行,我只想保存 [other] 文件,但 [other] 和 [name] 都将被更新。

解决这种情况的正确方法是什么?

4

2 回答 2

17

这是设计使然。

实体管理器确保您始终为给定的 id 获取相同的实体。毕竟,这就是身份的含义。只能有一个 ID 为 1 的唯一用户。

如果你想从数据库中“刷新”一个实体,EntityManager::refresh()会为你做这件事。从文档:

从数据库中刷新实体的持久状态,覆盖任何尚未持久的本地更改。

于 2012-05-25T19:24:31.580 回答
6

您必须执行命令:$entityManager->detach($userEntity);。调用 flush 后,更改将不会反映在数据库中。其他实体将起作用。

于 2014-01-16T02:34:14.790 回答