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

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


$e->setFoo('a');

$e->setBar('b');

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


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


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


犯罪嫌疑人X
浏览 603回答 3
3回答

30秒到达战场

您可以使用 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事件侦听器之外使用。这将破坏教义的行为。

倚天杖

您可以使用 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事件侦听器之外使用。这将破坏教义的行为。

侃侃无极

检查此公共(而非内部)功能:$this->em->getUnitOfWork()->getOriginalEntityData($entity);从教义回购中:/** * Gets the original data of an entity. The original data is the data that was * present at the time the entity was reconstituted from the database. * * @param object $entity * * @return array */public function getOriginalEntityData($entity)您要做的就是在您的实体中实现toArray或serialize函数并进行比较。像这样的东西:$originalData = $em->getUnitOfWork()->getOriginalEntityData($entity);$toArrayEntity = $entity->toArray();$changes = array_diff_assoc($toArrayEntity, $originalData);
打开App,查看更多内容
随时随地看视频慕课网APP