【问题标题】:Doctrine refresh copy of entity实体的教义刷新副本
【发布时间】:2014-09-10 19:32:44
【问题描述】:

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

我使用的一个 hack 是 $oldAccount = unserialize(serialize($account)); 并将旧的传递给我的服务,但这真的是 hackish。

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

这可能吗?

更新

目前看来,我真正想做的事情在 Doctrine 的架构方式下最终是不可能的。

更新 2

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

【问题讨论】:

  • 是的,我已经在另一个地方这样做了。但我不希望它成为我的锤子。这是我想告诉 Doctrine “不,请从数据库中重新获取实体。我真的,真的知道我在做什么。”
  • @Fabian,没有。这将使用数据库中的数据消除对原始实体的更改。我真正想要的是两个实体。一个前更改,一个后更改。但不必经历回旋或泄漏抽象。

标签: php symfony doctrine-orm


【解决方案1】:

视情况而定。

我的意思是,Doctrine2 使用IdentityMap 可以防止您“不小心”在同一请求中一遍又一遍地查询数据库以获取同一对象。强制再次获取实体对象的唯一方法是 detach 来自实体管理器的实体并再次请求实体。

然而,这可能会导致一些奇怪的行为,可能会“滑出”您的控制之外:

  • 你不能再持久化一个分离的对象
  • 如果您尝试持久化与您的分离实体相关(“链接”)的对象,您会遇到麻烦(有时很难调试)

那么,你为什么不试试php内置的clone函数呢?也许更适合你,可以让你免于大量调试

代码示例:

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

【讨论】:

  • 我也建议克隆+1
  • 这两条路线我都走了。克隆没有做我想做的事,在我想做的层。我还尝试分离原始,克隆,附加克隆,刷新克隆,分离克隆,附加原始。但这也没有用。我有一个实体挂在持有设备的 CustomerAccount 上。该设备实体从未被克隆。我可以让 CustomerAccount 完全实现克隆,但这似乎是一个 hack。
  • @DanMorphis:我不明白你的意思。你能说得更准确点吗?
  • @DonCallisto,您需要哪一部分的更多信息?
  • @DanMorphis:为什么不能使用 clone 或 defetch?我们需要更多详细信息以便以更好的方式帮助您(我现在才注意到您对 cme​​ts 的更新,我会检查)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-02-01
    • 2011-08-04
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多