如何在Doctrine 2中丢弃对实体的非刷新更改?

时间:2012-05-25 08:19:47

标签: orm doctrine doctrine-orm

我长期使用基于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对象。更改[名称]并尝试保存,但失败了。在第二个块(与第一个块无关)中,我再次获取了$ user对象。但是ORM第一次返回了与同一对象的链接。所以这个对象已经改变了[name]属性。在第二个块的最后一行,我只想保存[其他]字段,但[other]和[name]都将被更新。

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

2 个答案:

答案 0 :(得分:16)

这是设计的。

实体管理器确保您始终为给定的ID返回相同的实体。毕竟,这就是身份意味着什么。只能有一个ID为1的唯一用户。

如果您想从数据库中“刷新”某个实体,EntityManager::refresh()会为您执行此操作。来自文档:

  

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

答案 1 :(得分:5)

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