假设我检索一个实体$e
,并使用setters修改其状态:
$e->setFoo('a');
$e->setBar('b');
是否有可能检索已更改的字段数组?
在我的示例中,我希望检索foo => a, bar => b
个结果
PS:是的,我知道我可以修改所有的访问器并手动实现这个功能,但我正在寻找一些方便的方法来实现这一点
假设我检索一个实体$e
,并使用setters修改其状态:
$e->setFoo('a');
$e->setBar('b');
是否有可能检索已更改的字段数组?
在我的示例中,我希望检索foo => a, bar => b
个结果
PS:是的,我知道我可以修改所有的访问器并手动实现这个功能,但我正在寻找一些方便的方法来实现这一点
你可以用
然后通过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);
Note.如果试图获取更新的字段inside a preUpdate listener,不要重新计算更改集,因为已经这样做了.只需调用getEntityChangeSet即可获取对实体所做的所有更改.
Warning:如 comments 中所述,此解决方案不应在事件侦听器之外使用.这将 destruct 教条的行为.