为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
犯罪嫌疑人X 2019-11-25 15:27:48
假设我检索一个实体$e并使用setter修改了它的状态:$e->setFoo('a');$e->setBar('b');是否有可能检索已更改的字段数组?在我的例子的情况下,我想检索foo => a, bar => b结果PS:是的,我知道我可以修改所有访问器并手动实现此功能,但是我正在寻找一些方便的方法
查看完整描述

3 回答

?
30秒到达战场

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


查看完整回答
反对 回复 2019-11-25
?
倚天杖

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


查看完整回答
反对 回复 2019-11-25
?
侃侃无极

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);


查看完整回答
反对 回复 2019-11-25
  • 3 回答
  • 0 关注
  • 602 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信