Doctrine 2.x - isModified等价?

时间:2011-07-27 13:11:50

标签: php symfony doctrine-orm

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

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

当Doctrine已经跟踪时,通过另一种方法跟踪变化似乎是一个巨大的重复工作,所以我希望有一种方法。

2 个答案:

答案 0 :(得分:1)

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

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

否则,如果您可以使用pre-update注释,则可以随时使用persist/all cascade注释。

我建议您不要在关联中使用{{3}} - 您将获得一个例外,然后您需要先保留关联。也可以帮助调试双重持续问题。

答案 1 :(得分:0)

在我们基于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插入排队两次。

我们已采取类似于通知跟踪政策中建议的措施 - 基本上挂钩了我们所有的设置者。

  

注意此答案由OP Mark

发布