3 回答
TA贡献1828条经验 获得超6个赞
您可以使用 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事件侦听器之外使用。这将破坏教义的行为。
TA贡献1828条经验 获得超3个赞
您可以使用 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事件侦听器之外使用。这将破坏教义的行为。
TA贡献2051条经验 获得超10个赞
检查此公共(而非内部)功能:
$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);
- 3 回答
- 0 关注
- 602 浏览
添加回答
举报