如何强制 Doctrine 更新数组类型字段?

2024-02-06

我有一个带有数组类型字段的 Doctrine 实体:

/**
 * @ORM\Table()
 */
class MyEntity
{
    (...)

    /**
     * @var array $items
     * 
     * @ORM\Column( type="array" ) 
     */
    private $items;

    /**
     * @param SomeItem $item 
     */
    public function addItem(SomeItem $item)
    {
        $this->items[] = $item;
    }

    (...)
}

如果我向数组添加元素,此代码可以正常工作:

$myEntityObject->addItems(new SomeItem()); 
$EntityManager->persist($myEntityObject);
$EntityManager->flush();

$myEntityObject以正确的数据保存到数据库(数组被序列化,查询数据库时反序列化)。

不幸的是,当我更改数组内的一个对象而不更改该数组的大小时,如果我尝试将更改保存到数据库,Doctrine 不会执行任何操作。

$items = $myEntityObject->getItems();
$items[0]->setSomething(123);
$myEntityObject->setItems($items);
$EntityManager->persist($myEntityObject);
$EntityManager->flush();
print_r($myEntityObject);

虽然,print_r该代码的最后一行显示更改后的对象数据,如果数组大小未更改,Doctrine 并不知道数组内部发生了某些更改。有什么方法可以强制 Doctrine 保存在该字段中所做的更改(或者温和地通知它该字段中需要保存的更改)?


刚刚在文档中找到了解决我的问题的方法:

http://docs.doctrine-project.org/en/latest/reference/change-tracking-policies.html http://docs.doctrine-project.org/en/latest/reference/change-tracking-policies.html

它需要对代码进行大量更改,但它可以工作。有人知道如何保留其他字段的默认跟踪策略并仅对存储数组的字段使用 NotifyPropertyChanged 吗?


Doctrine 使用相同的运算符 (===) 来比较新旧值之间的变化。对具有不同数据的同一对象(或对象数组)使用的运算符始终返回 true。还有另一种方法可以解决这个问题,您可以克隆需要更改的对象。

$items = $myEntityObject->getItems();
$items[0] = clone $items[0];
$items[0]->setSomething(123);
$myEntityObject->setItems($items);

// ...

或者改变setItems()方法(我们只需要克隆一个对象来持久化整个数组)

public function setItems(array $items) 
{
    if (!empty($items) && $items === $this->items) {
        reset($items);
        $items[key($items)] = clone current($items);
    }
    $this->items = $items;
}

关于第二个问题:

有人知道如何保留其他字段的默认跟踪策略并仅对存储数组的字段使用 NotifyPropertyChanged 吗?

您不能仅针对一个字段设置跟踪策略。

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

如何强制 Doctrine 更新数组类型字段? 的相关文章

  • 如何在响应ajax codeigniter后停止执行其他控制器

    我想知道如何在响应输出 json 数据后停止执行函数和涉及的其他控制器 就我这里的情况而言 我只是打电话test 函数于dashboard控制器 In dashboard构造函数将执行MY Login library In MY Login
  • 如何从父类函数访问子类中定义的常量?

    我从 php net 看到这个例子 但 c MY CONST 仅在 5 3
  • PHP严格标准:声明应该兼容

    我有以下类层次结构 class O Base class O extends O Base abstract class A Abstract public function save O Base obj class A extends
  • 扩展蓝图类?

    我想覆盖timestamps 函数中发现Blueprint班级 我怎样才能做到这一点 e g public function up Schema create users function Blueprint table table gt
  • 为什么我需要结束 ob_start()?

    php 文档建议我应该用 ob end flush 结束每个 ob start 我在网站的每个页面上使用一个 只是为了允许我在应用程序中的任何位置使用 firephp 日志方法 该应用程序运行良好 但我想知道是否有任何我不知道的东西可能有害
  • 使用 preg_replace 仅替换第一个匹配项

    我有一个结构类似于以下的字符串 aba aaa cba sbd dga gad aaa cbz 该字符串每次都可能有点不同 因为它来自外部源 我只想替换第一次出现的 aaa 但其他人则不然 是否可以 可选的第四个参数预替换 http php
  • 学说迁移后备

    我们正在使用原则迁移 当迁移包含多个操作并且其中一个操作失败时 通常会出现问题 例如 如果迁移添加了 5 个外键 其中第 5 个失败 而字段长度不同 则修复字段错误并重新生成迁移不会not修复整个问题 而现在出现一个与 4 个密钥已存在有关
  • “使用未定义常量”注意,但该常量应该被定义

    共有三个文件 common php controller php 和 user php 文件 common php 如下所示 文件controller php看起来像 文件 user php 如下所示 执行脚本时 会给出通知 注意 使用未定
  • 从数组中删除空白元素

    当我从 ruby on Rails 表单中保存多个选择时 它似乎在前面添加了一个空白元素 我该如何删除它 该字段为 selected player utf8 gt authenticity token gt H8W7qPBezubyeU0a
  • 在 PHP 中撤销 Google 访问令牌

    正如标题所示 我想以编程方式撤销授予的访问令牌 即在 PHP 中 我发现这个他们的网站 https developers google com identity protocols OAuth2WebServer tokenrevoke 但
  • MySQL 追加字符串

    How can I append a string to the end of an existing table value Let s say I have the table below And let s say that Mari
  • 在 PHP 中使用 phpseclib 时出现 RSA 问题

    我正在尝试在 phpseclib 中使用 RSA 实现 我认为在函数中执行一次代码并重新使用该函数会更容易 当我尝试向代码发送短信时 我收到一条错误消息 提示 解密错误 测试还让我意识到每次代码运行时密文都是不同的 所以我显然在那里做错了什
  • 通过 $_SESSION 从一个脚本发送到另一个脚本期间数据丢失

    我正在尝试将一个充满属性的对象从一个 PHP 发送到另一个 PHP SESSION object obj where obj是一个用 foreach 循环指定的对象 foreach array of objects as obj SESSI
  • 在 apache docker 容器中运行虚拟主机

    我在同一个 apache 容器中有两个 php 应用程序 我试图在端口上运行其中一个应用程序 因为它需要通过根域而不是子文件夹进行访问 我想在端口 8060 上运行应用程序 我尝试使用 apache 虚拟主机执行此操作 但它不会加载页面 h
  • SQL 最近日期

    我需要在 php 中获取诸如 2010 04 27 之类的日期作为字符串 并在表中找到最近的 5 个日期 表中的日期保存为日期类型 您可以使用DATEDIFF http dev mysql com doc refman 5 1 en dat
  • php 错误 fopen(): 文件名不能为空

    发送带有附件代码的电子邮件工作正常 最近我们已将文件传输到另一个托管服务器 idk 发生了什么 它显示以下错误 警告 fopen 第 106 行 home hugerecruitmetnt public html validatecva p
  • Doctrine EntityManager 清除嵌套实体中的方法

    我想用学说批量插入处理 http doctrine orm readthedocs org en latest reference batch processing html为了优化大量实体的插入 问题出在 Clear 方法上 它表示此方法
  • CURL 中的 data-urlencode 是什么意思?

    我搜索了很多个小时试图弄清楚 php curl 中的 data urlencode 是什么 我尝试过这个 但我认为这是不对的 xmlpost object1 file https www lob com goblue pdf 在文档中是 d
  • 如何使用 PHPExcel 库从 Excel 获取日期

    我正在尝试使用 PHPExcel 从 Excel 获取日期 但我没有得到日期 我得到的字符串值不是 1970 以来的秒数 我尝试过的代码是 InvDate trim excel gt getActiveSheet gt getCell B
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser

随机推荐

  • 记录 C(或可能是 C++)中 X 宏的使用模式的良好参考资料是什么?

    的基本定义和示例以及一些参考资料X Macros http en wikipedia org wiki C preprocessor X Macros 在此给出C 预处理器的维基百科条目 http en wikipedia org wiki
  • 有效地将矩阵值复制到新矩阵

    是否有一种有效的内置方法可以从一个矩阵复制值 例如 double 到另一个 换句话说 我正在寻找以下函数的替代品 public static double CloneMatrix double aMatrix var newMatrix n
  • AutoCompleteTextView 和 Spinner 使用相同适配器时出现问题

    我有一个 类别 列表 它们作为字符串存储在我的应用程序的 ArrayAdapter 中 这很简单 适配器是活动的一个字段 可以在任何地方访问 它是在 onCreate 期间填充值的 我有一个 条目 对话框 其中包含一个 AutoComple
  • C中循环条件下的逗号运算符

    include
  • 有没有可以浏览您应用程序的 iCloud 数据的工具?

    我正在努力将 iCloud 集成到我的应用程序中 有时会遇到冲突和保存错误的问题 数据存储在云端的事实使得调试问题变得非常困难 据我所知 iCloud 服务器上的数据会镜像到设备上的目录中 有没有任何工具 iOS 或 OSX 应用程序 可以
  • Angular Tour of Heroes:inMemory Web API 的问题

    我正在学习著名的 Angular 教程 英雄之旅 但我在迈出一步时遇到了困难 On the 第六课 HTTP https angular io tutorial toh pt6 我们正在使用一个模拟 API 调用 API 的工具 我想我遵循
  • 模拟NLog的记录器并读取记录的消息

    我使用 NLog 4 5 11 进行日志记录 使用 moq 4 10 1 进行模拟 我有一个中间件 它使用 NLog 将异常详细信息写入日志文件 我需要在 API 项目中对中间件进行单元测试 并检查记录的消息是否有正确的值 这就是我声明异常
  • 在 Powershell 中用于退出 Python 的 Ctrl-C 现在不起作用

    在 Powershell 命令提示符中使用 Ctrl C 时 Python 无法退出 而是给出 KeyboardInterrupt 字符串 最近我重新安装了 Windows 10 在重新安装之前 Ctrl C 退出 python 3 5 2
  • 无法将 Pod 更新到最新版本

    我正在使用react native 并且我正在尝试使用以下命令来更新pod pod update 但它什么也没更新 但是 当我使用 pod outdated 它显示了这个 Updating spec repo master usr bin
  • 从 A-frame 自动播放 videosphere 不适用于任何浏览器(Safari/Chrome)

    我正在开发一些 A 框架项目 但 videosphere 没有自动播放其源代码 我从cinema4d渲染了一个球体视频并注入了元数据 我可以看到源已加载 但未播放 我原本想在本地播放60MB的视频 但是即使我将视频剪切到1MB以下 它仍然无
  • 如何将列的子级与底部对齐

    我正在尝试构建一个通用主页 我想将列的最后一个子项 其中包含页面的所有小部件 与屏幕底部对齐 但对齐中包裹的小部件没有移动 以下是对我来说最有意义的 Column mainAxisSize MainAxisSize max children
  • 解析具有自定义声音的推送通知播放默认声音

    我发送应用程序收到的解析推送通知 但请求的声音未播放 而是播放默认声音 应用程序已将声音保存在文档文件夹中 我可以在 iTunes 中查看它们是否在那里 在某些时候 这是有效的 但由于某种原因 它已停止播放请求的声音 如果我记录推送通知用户
  • Jenkins 将不会使用 Java 7 编译器

    我正在与一个团队合作开发一个 Maven 项目 并在 Jenkins 中为其设置了一个构建作业 最近 团队中的某人添加了打开字符串的代码 这导致 Jenkins 中的构建失败 并出现以下错误 error strings in switch
  • Bootstrap 响应式折叠子菜单在第一次折叠时具有固定高度

    这个问题可能出现在所有 据我所知 Twitter Bootstrap 版本中 所以 我有一个导航栏 当屏幕较小时 它就变成了一个可折叠托盘 此行为可以在引导演示站点上看到 我还有子菜单 它们在最初的导航栏扩展时显示为折叠的 问题是 在第一次
  • 在我的网站中显示 Facebook Graph API 点赞数

    我在 Facebook Graph API 中使用 fields fan count 从我的 Facebook 页面获取喜欢的数量 但我不知道如何在我的网站中显示计数器 那是网址 该 URL 返回点赞数和我的页面 id 我想只显示 fan
  • ZF2 Form:自定义元素顺序

    我正在为登录用户创建一个表单来更改其密码 因此我创建了可用的现有密码重置表单的子类 除了现有密码的附加字段之外 表格将完全相同 到目前为止 它一直有效 只是我无法找到一种方法来手动设置新字段的顺序 我让它出现的唯一地方是表格的末尾 看来ZF
  • 如何使用 oauth/jwt 保护我的 http 触发的 GCP 功能?

    借助 AWS Lambda 和 API Gateway 我可以部署通过 http 公开的函数 借助 Cognito 和 API Gateway 我可以使用 oauth2 和 jwt 令牌来保护该函数 借助 GCP 函数和 http trig
  • Jetpack Compose - 当宽度增加时行剪切子项

    在右侧 我有一个可组合项中的项目列表 每个项目都位于一行内 所有项目都位于一列内 所有的子项都被剪裁以适应我不想要的屏幕 我希望这些项目即使在屏幕之外也能完全渲染 因为我在它们上面有一个可缩放的容器 正如您所看到的 文本字段中的文本如何垂直
  • Swift:尝试使用点击手势时出现“无法识别的选择器发送到实例”错误

    我收到的错误 由于未捕获的异常 NSInvalidArgumentException 而终止应用程序 原因 App DetailController tap 无法识别的选择器发送到实例 0x109803800 我的视图控制器名为 Detai
  • 如何强制 Doctrine 更新数组类型字段?

    我有一个带有数组类型字段的 Doctrine 实体 ORM Table class MyEntity var array items ORM Column type array private items param SomeItem it