条令刷新实体副本


Doctrine refresh copy of entity

我有一个CustomerAccount实体。在通过表单对该实体进行更改之后,但在将该实体持久化到数据库之前,我需要获取该实体当前存在于数据库中的同一CustomerAccount的新副本。我需要这样做的原因是,我想用我的服务中的旧数据和新数据启动一个已更改的事件。

我使用的一个黑客是$oldAccount = unserialize(serialize($account));,并将旧的传入我的服务中,但这真的很黑客。

我真正想做的是让Doctrine收回原始实体的副本(同时保留对新版本的更改)。

这可能吗?

更新

现在看来,按照条令的架构,我真正想做的事情最终是不可能的。

更新2

我在底部添加了最终使用的解决方案。我对它并不完全满意,因为它感觉很粗糙,但它完成了任务,让我可以继续前进。

这取决于情况。

我的意思是,Doctrine2使用了IdentityMap,它可以防止您在同一请求中一次又一次地"意外"查询数据库中的同一对象。强制条令再次获取实体对象的唯一方法是将实体从实体管理器分离并再次请求实体。

然而,这可能会导致一些奇怪的行为,这些行为可能会"滑"出你的控制范围:

  • 无法再次保持分离的对象
  • 如果您试图持久化与分离实体相关("链接")的对象,您将遇到麻烦(有时很难调试)

那么,为什么不尝试使用php内置的克隆功能呢?也许更适合你,可以省去你对的大量调试

代码示例:

$em = $this->getDoctrine()->getManager();
$fetched_entity = $em->findOnById(12);
$cloned_entity = clone $fetched_entity;
//and so on ...

这是我最终使用的最终解决方案。我在config.yml中创建了一个重复实体管理器,并从重复实体管理程序中检索了该实体的第二个副本。因为我不会对重复实体管理器检索到的实体进行任何更改,所以这个解决方案最适合我的用例。