【问题标题】:Doctrine 2.x - isModified equivalent?Doctrine 2.x - isModified 等效?
【发布时间】:2011-07-27 13:11:50
【问题描述】:

在 Doctrine 1.x 中,有一个 $entity->isModified() 方法,恰好非常有用。有没有人找到在 Doctrine 2.x 中复制此功能的方法?

我已经探索了一些途径,例如检索 UnitOfWork,要求它计算相关实体的更改,然后询问该实体是否在更改队列中,但所有这些都造成了令人讨厌的一面- M2M 关系被插入两次等效果,导致数据库约束异常。我想这意味着这“不是预期的用途”!

当 Doctrine 已经在跟踪时,通过另一种方法来跟踪更改似乎是一项巨大的重复工作,所以我希望有办法。

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案1】:

    我想看一些代码来了解它是如何被插入两次的。另外,你为什么要这样做?

    无论如何,您可以考虑更改您的tracking policy。听起来您正在寻找通知政策。

    否则,您可以随时使用pre-update 注释,如果您能侥幸成功的话。

    我建议你不要在关联中使用persist/all cascade - 你会得到一个例外,然后你需要先保持关联。也可能有助于调试双重持续问题。

    【讨论】:

    • 谢谢 - 已更新帖子以添加更多详细信息 :) 我们开始认为,通知跟踪政策中建议的内容似乎还有很长的路要走。
    【解决方案2】:

    在我们基于 Doctrine 1.x 的 CMS 中,我们通常会获取相关实体,用数据填充它,然后询问 $entity->isModified()? (如果没有,我们可以向用户发送反馈 - “没有更改”)

    在代码方面,isModified() 替换是这样的:

    public function isModified($entity) {
      $metadata = $this->em->getClassMetadata(get_class($entity));
      $uow = $this->em->getUnitOfWork();
    
      $uow->computeChangeSet($metadata, $entity);
      return $uow->isEntityScheduled($entity);
    }
    

    不幸的是,如果我们添加了 M2M 关系,这会导致 M2M 在持久化时被添加两次,这可能是由于 Doctrine 然后调用 uow->computeChangeSets(),导致 M2M 插入排队两次。

    我们已经采取了类似于通知跟踪政策中建议的方式 - 本质上是挂钩我们所有的 setter。

    注意此答案由 OP Mark 提出问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-18
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多