假设我检索一个实体$e并使用setter修改了它的状态:
$e
$e->setFoo('a'); $e->setBar('b');
是否有可能检索已更改的字段数组?
在我的例子的情况下,我想检索foo => a, bar => b结果
foo => a, bar => b
PS:是的,我知道我可以修改所有访问器并手动实现此功能,但是我正在寻找一些方便的方法
您可以使用 Doctrine\ORM\EntityManager#getUnitOfWork获取Doctrine\ORM\UnitOfWork。
Doctrine\ORM\EntityManager#getUnitOfWork
Doctrine\ORM\UnitOfWork
然后只需通过触发变更集计算(仅适用于托管实体)Doctrine\ORM\UnitOfWork#computeChangeSets()。
Doctrine\ORM\UnitOfWork#computeChangeSets()
您也可以使用类似的方法,例如,Doctrine\ORM\UnitOfWork#recomputeSingleEntityChangeSet(Doctrine\ORM\ClassMetadata $meta, $entity)如果您确切知道要检查的内容而无需遍历整个对象图。
Doctrine\ORM\UnitOfWork#recomputeSingleEntityChangeSet(Doctrine\ORM\ClassMetadata $meta, $entity)
之后,您可以Doctrine\ORM\UnitOfWork#getEntityChangeSet($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事件侦听器之外使用。这将破坏教义的行为。