一尘不染

是否有内置方法来获取Doctrine 2实体中的所有已更改/更新的字段

php

假设我检索一个实体$e并使用setter修改了它的状态:

$e->setFoo('a');
$e->setBar('b');

是否有可能检索已更改的字段数组?

在我的例子的情况下,我想检索foo => a, bar => b结果

PS:是的,我知道我可以修改所有访问器并手动实现此功能,但是我正在寻找一些方便的方法


阅读 196

收藏
2020-05-26

共1个答案

一尘不染

您可以使用 Doctrine\ORM\EntityManager#getUnitOfWork获取Doctrine\ORM\UnitOfWork

然后只需通过触发变更集计算(仅适用于托管实体)Doctrine\ORM\UnitOfWork#computeChangeSets()

您也可以使用类似的方法,例如,Doctrine\ORM\UnitOfWork#recomputeSingleEntityChangeSet(Doctrine\ORM\ClassMetadata $meta, $entity)如果您确切知道要检查的内容而无需遍历整个对象图。

之后,您可以Doctrine\ORM\UnitOfWork#getEntityChangeSet($entity)用来检索对对象的所有更改。

把它放在一起:

$entity = $em->find('My\Entity', 1);
$entity->setTitle('Changed Title!');
$uow = $em->getUnitOfWork();
$uow->computeChangeSets(); // do not compute changes if inside a listener
$changeset = $uow->getEntityChangeSet($entity);

注意。 如果尝试获取 preUpdate侦听器中
的已更新字段,请不要重新计算更改集,因为更改集已经完成。只需调用getEntityChangeSet即可获取对该实体所做的所有更改。

警告: 如评论中所述,此解决方案不应在Doctrine事件侦听器之外使用。这将破坏教义的行为。

2020-05-26