如何访问 Doctrine2 中 PrePersist LifecycleCallback 的旧值

2023-12-22

我在 Doctrine2 中有一个实体,并将 HasLivecycleCallbacks 与 PrePersist 一起使用。一般来说,这工作得很好,但我只想在实体中的某些字段发生变化时更改版本。我有机会获得旧的价值观吗?还是只是更改了键值?

/**
 * @ORM\HasLifecycleCallbacks
 */
class Person {


    /**
     * @PrePersist
     * @PreUpdate
     */
    public function increaseVersion() {


            if ( $this->version == null ) {
                $this->version = 0;
            }
            // only do this, when a certain attribute changed
            $this->version++;
    }
}

这取决于我们正在谈论哪个 LifecycleEvent。PrePersist 和 PreUpdate 是不同的事件。 https://stackoverflow.com/questions/14345630/symfony-preupdate-vs-prepersist

更新前在实体更新之前触发。这会给你一个PreUpdateEventArgs https://www.doctrine-project.org/api/orm/2.6/Doctrine/ORM/Event/PreUpdateEventArgs.html对象,它是一个扩展的LifecycleEventArgs目的。这将允许您查询更改的字段并允许您访问旧值和新值:

if ($event->hasChangedField('foo')) {
    $oldValue = $event->getOldValue('foo');
    $newValue = $event->getNewValue('foo');
}

您还可以通过以下方式获取所有更改的字段值getEntityChangeSet(),这会给你一个像这样的数组:

array(
    'foo' => array(
        0 => 'oldValue',
        1 => 'newValue'
    ),
    // more changed fields (if any) …
)

预坚持另一方面,假设一个新的实体(认为插入新行)。在 PrePersist 中,您将得到LifecycleEventArgs http://www.doctrine-project.org/api/orm/2.4/class-Doctrine.ORM.Event.LifecycleEventArgs.html对象只能访问实体和EntityManager http://www.doctrine-project.org/api/orm/2.4/class-Doctrine.ORM.EntityManager.html。理论上,您可以访问UnitOfWork http://www.doctrine-project.org/api/orm/2.4/class-Doctrine.ORM.UnitOfWork.html(它跟踪实体的所有更改)通过EntityManager,所以你可以尝试这样做

$changeSet = $event->getEntityManager()->getUnitOfWork()->getEntityChangeSet(
    $event->getEntity()
);

获取要持久化的实体的更改。然后您可以检查该数组是否有更改的字段。然而,由于我们讨论的是插入而不是更新,我假设所有字段都将被视为“已更改”,并且旧值可能全部为空。我不确定,这是否会根据您的需要起作用。

进一步参考:http://docs.doctrine-project.org/en/2.0.x/reference/events.html http://docs.doctrine-project.org/en/2.0.x/reference/events.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何访问 Doctrine2 中 PrePersist LifecycleCallback 的旧值 的相关文章

随机推荐

  • 如何为 hadoop 2.0 编译/使用 mahout?

    最新版本的 Mahout 0 9 仅基于 hadoop 1 x 构建 mvn 干净安装 如何为 hadoop 2 0 x 编译 mahout 因为当我运行命令时 hadoop jar mahout examples 0 9 SNAPSHOT
  • 如何使用可变大小的缓冲区获取c类型结构中字段的值?

    import readboard import struct import ctypes as c def readbuffer data size struct unpack
  • 碰撞检测/从 ArrayList 中删除对象

    我目前正在尝试测试下落物体和盒子之间的碰撞 我了解基本的碰撞检测 但我的问题是我必须测试它是否有无限数量的下落物体 当这些对象 blossoms 被创建时 它们被存储在一个ArrayList中 ArrayList 处理画布上对象的绘制 使用
  • 通过ilasm更改可执行图标

    我有一个安装程序应用程序 其中嵌入了 resx 文件 其中包含一些信息 例如服务器名称 端口 密码等 我必须生成这个安装程序 这个过程是自动化的 并通过我们的网站完成 对于每个客户 这工作正常 我用ildasm用于反汇编程序并替换 resx
  • 来自浏览器的过时加密警告

    我已经启动了带有 Apache 2 4 和 SSL 的 Windows Server 当我连接时https www example com https www example com然后点击绿色锁 我有消息 您与网站的连接已使用过时的加密技
  • 使用 Python 将整个 JSON 转换为一个 SQLite 字段

    我有一个可能很简单的问题 我正在尝试从在线源中提取 JSON 并将其存储在 SQLite 表中 除了将数据存储在丰富的表中 对应于 JSON 中的许多字段 之外 我还想在每次拉取时将整个 JSON 转储到表中 该表看起来像 CREATE T
  • 实现接口的类列表

    有没有办法实现类似的东西 List
  • 在jquery中获取外部url的html

    如何使用 jquery 获取外部 URL 的 HTML 简短的回答是你不能 因为 AJAX 请求被限制在相同的 子 域和端口上 同源政策 https developer mozilla org En Same origin policy f
  • Robocopy 后,复制的目录和文件在目标驱动器上不可见

    我很高兴使用 robocopy 将我的计算机备份到外部 USB 驱动器 这很棒 因为它只复制已更改 更新 新的文件 我可以将外部驱动器带到任何机器上并查看它 就像它是计算机上的另一个驱动器一样 我最近购买了一个 750g 和另一个 1tb
  • CoreMotion 在后台状态更新

    借助最新 iOS 设备中的 M7 芯片 当用户使用 CMMotionActivityManager 从静止状态变为跑步 行走等时 可以通过编程方式获得通知 Stava 和 Runkeeper 都用过这个自动暂停 GPS 轮询 http gi
  • 如何从另一个页面控制viewPages页面

    我有一个ViewPager共 3 页listView在每个页面中 我想要动画listView以某种方式 当用户水平滑动下一页时 listView应该根据下一页的宽度来 即第一个项目应该完全推入 第二个应该是可见的一半 口渴应该是第二个可见的
  • 如何在 Material UI 5 中使用 useTheme?

    我刚刚开始使用 Material UI 5 0 4 带有styled components 我想访问组件中的主题 我在网上查了一下 看到useTheme 所以我检查了文档并found it https mui com styles adva
  • 自动实例化会话bean?

    我有一个会话 bean
  • 是否可以通过电子邮件地址进行 XSS 攻击?

    我想知道电子 邮件地址是否可以用于XSS攻击 假设有一个网站 人们可以在其中注册并提供他的电子邮件地址 如果有人想要攻击给定的网站 他或她可能会创建一个电子邮件地址 例如 stmpname com 然后使用该电子邮件地址攻击该网站 电子邮件
  • 编写 lisp emacs 键绑定并且无法指定 字符

    由于某种原因 我将向后杀字的默认 M del 键绑定映射到匹配括号的扫描 并且重置不起作用 所以我尝试在 lisp 中设置全局键绑定 所以我在 emacs d init el 中编写了 lisp 命令 全局设置键 kbd M h 向后杀字
  • XSD 和 WSDL 位于不同的目录中

    在我的工作中使用 jaxws maven plugin 进行代码生成 我有两个项目分别是 common 和 client 结构大致如下 app common resource some xsd client resource some ws
  • 在 Blazor Web Assembly 应用中显示本地计算机摄像头源

    我已将问题简化为样板 Blazor Web Assembly 应用程序 该项目直接来自向导 添加了以下代码 我已将 Index razor 页面更改为 page inject IJSRuntime JSRuntime using Syste
  • 多设备混合应用程序中未指定 NodeJs 的路径

    当我尝试构建项目时 我收到一条错误消息 例如 NodeJs 的路径尚未指定 文件名为 Microsoft MDA target 如何在其中指定node js路径 错误消息是 尚未指定 NodeJs 的路径 请在构建之前检查 NodeJs 是
  • 错误:模板可能不是“虚拟”

    我希望能够向基类 MCFormater 提供适用于不同类型 uint32 uint8 的格式化方法 class MCFormater public MCFormater virtual MCFormater virtual mcc t Ge
  • 如何访问 Doctrine2 中 PrePersist LifecycleCallback 的旧值

    我在 Doctrine2 中有一个实体 并将 HasLivecycleCallbacks 与 PrePersist 一起使用 一般来说 这工作得很好 但我只想在实体中的某些字段发生变化时更改版本 我有机会获得旧的价值观吗 还是只是更改了键值