当前位置: 首页 > 面试题库 >

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

司马高昂
2023-03-14
问题内容

假设我检索一个实体$e并使用setter修改了它的状态:

$e->setFoo('a');
$e->setBar('b');

是否有可能检索已更改的字段数组?

在我的例子的情况下,我想检索foo => a, bar => b结果

PS:是的,我知道我可以修改所有访问器并手动实现此功能,但是我正在寻找一些方便的方法


问题答案:

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



 类似资料:
  • 我想知道我有没有“你好世界”这样的文字。我如何设置这个文本视图的偏好,用户可以改变字体大小为中,大,小像20SP,25SP,30SP。

  • 问题内容: 我的桌子上有很多记录(可能超过500 000或1 000 000)。我在此表中添加了一个新列,我需要使用该表中另一列的相应行值为该列中的每一行填充一个值。 我尝试使用单独的事务来选择每100条记录的下一个块并为其更新值,但是例如,要花费数小时来更新Oracle10中的所有记录。 在不使用某些方言特定功能的情况下,在SQL中执行此操作的最有效方法是什么,因此它可在任何地方(Oracle,

  • 这对于初始注入/bean构建非常有效。一些网络教程建议采用这种方法。 现在,我认为可以合理地假设配置值(如果存储在DB中)可能会在运行时发生变化。因此,每当管理员更改数据库配置值时,我就会触发CDI-Event。 问题:有什么方法可以将值重新注入到已经初始化的bean实例的字段中吗?还是注入总是只与实例创建相关? 然而,我想知道一个普遍的问题:是否有任何支持重新注射?或者如果不是,规范(CDI或J

  • 我想这可能是一个新手问题,但我仍然想知道一些答案。 假设存在实体:医院和医生(多对多)。假设在我的controller类中,我必须获取所有现有的医生和医院,然后在特定的医院雇佣一名医生 它当然不起作用,因为--据我所知--我已经在控制器中获取了所有的医生和医院,然后在hireDoctor方法中,我们打开了传递常规Java对象的trasaction,这些对象不在会话中。 我知道,我可以用一个特殊的身

  • Firebase控制台支持配置远程配置参数的简单方法。 在我们的应用程序中,每个用户都有不同的远程配置,这些配置是在我们自己的门户网站上设置的。 有什么API可以让我把配置从我自己的门户推到Firebase远程配置服务器,然后在android应用程序上使用远程配置库来获得新的配置吗?

  • 我在实体“任务”和实体“用户”之间有双向关联。 “任务”定义如下 “用户”的定义是 从两个方向访问关系很好。问题是,一旦定义了“Task”实体,我就无法更新它。 这是一个测试案例 我做错了什么?