假设我检索一个实体$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 教条的行为.

Php相关问答推荐

无法使用PHP DomDocument找到IMG元素

我需要多个SELECT语句的结果(使用由php ECHO创建的表中显示的Limit(X)

WooCommerce购物车中仅允许一个可下载产品

根据未用于变体的产品属性隐藏WooCommerce发货方式

从WooCommerce订单状态更改更新用户自定义元数据

按与WooCommerce管理顺序列表中的特定字符串不匹配的特定元值筛选订单

PHP根据特定索引值从中删除子数组

PHP -将字符串拆分为两个相等的部分,但第二个字符串中的单词更多

Laravel路由到控制器传输变量解决方案需要

Laravel withOnly不限制查询

关于Laravel缓存出现的错误

PHP API - 本地主机中的 SSL 证书问题

图片上传成功

向元素添加类时添加循环错误

PHP 简单 XML Xpath 上移树(带有名称的父级)

Laravel Eloquent:复杂的多对多关系以及缺失关系的默认值

从图像URL中获取文件扩展名?

如何在构建 PHP 类别数组树的递归函数中将父面包屑传递给子项?

在 Laravel、Vuejs 和 Inertia 中配置 TypeScript 的问题

使用 GROUP_CONCAT 规范化/转置来自查询的数据