Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Doctrine原生SQL与存储过程调用:弃用方法的现代化实践_创想鸟

Doctrine原生SQL与存储过程调用:弃用方法的现代化实践

Doctrine原生SQL与存储过程调用:弃用方法的现代化实践

本文针对doctrine中`fetchallassociative()`和`execute`方法在原生sql及存储过程调用场景下的弃用问题,提供了一套现代化的解决方案。通过结合`resultsetmapping`的标量结果映射功能与`createnativequery`及`getarrayresult()`方法,开发者可以高效、清晰地执行原生查询并获取数组形式的结果,无需进行实体映射,从而确保代码的兼容性和可维护性。

在Doctrine ORM的早期版本中,开发者常常使用Connection对象的prepare()方法配合execute()和fetchAllAssociative()来执行原生SQL查询或调用存储过程,以获取非实体映射的数组结果。然而,随着Doctrine版本的迭代,这些方法已被标记为弃用,鼓励开发者采用更符合ORM设计哲学且功能更强大的替代方案。当我们需要调用存储过程或执行复杂原生SQL,并且只希望获取原始的、非实体映射的数组结果时,尤其需要一套现代化的方法来替代这些弃用的功能。

弃用方法的背景与挑战

原始代码示例展示了这种常见的模式:

// 弃用方法示例$sql = 'CALL spWithParams(:param)';$stmt = $this->getEntityManager()->getConnection()->prepare($sql);$stmt->execute([":param"=>"test"]);print_r($stmt->fetchAllAssociative());

这段代码通过prepare()创建一个Statement对象,然后使用execute()执行,并最终通过fetchAllAssociative()获取关联数组形式的结果。当这些方法被弃用后,直接使用它们会导致代码警告,并可能在未来的Doctrine版本中完全移除,从而影响应用的稳定性。

现代化解决方案:ResultSetMapping与createNativeQuery

Doctrine提供了一套更为健壮和灵活的机制来处理原生SQL查询,即通过ResultSetMapping结合EntityManager的createNativeQuery()方法。这种方法不仅解决了弃用问题,还提供了更清晰的结果集映射能力,即使对于不映射到实体的情况也同样适用。

核心思想是使用ResultSetMapping来定义查询结果中每个列的类型和在最终数组中的键名,特别是对于标量结果(即非实体、非关联的简单数据列)。

步骤一:定义结果集映射 (ResultSetMapping)

ResultSetMapping对象允许你精确地指定数据库查询结果中的列如何映射到你的PHP数组。对于标量结果,我们使用addScalarResult()方法。

addScalarResult(string $columnName, string $fieldName)

$columnName: 这是数据库中实际的列名,或者是存储过程返回结果集中的列名。$fieldName: 这是你希望在最终PHP数组中使用的键名。

例如,如果你的存储过程返回一个名为my_database_column的列,而你希望在PHP中将其作为myField来访问,则可以这样定义:

use DoctrineORMQueryResultSetMapping;$rsm = new ResultSetMapping();$rsm->addScalarResult('my_database_column', 'myField');// 如果存储过程返回多个列,可以继续添加// $rsm->addScalarResult('another_db_column', 'anotherField');

步骤二:创建原生查询 (createNativeQuery)

一旦定义了ResultSetMapping,就可以使用EntityManager的createNativeQuery()方法来创建一个NativeQuery对象。

createNativeQuery(string $sql, ResultSetMapping $rsm)

$sql: 你的原生SQL语句或存储过程调用语句。$rsm: 上一步创建的ResultSetMapping对象。

$query = $this->getEntityManager()->createNativeQuery(    'CALL spWithParams(:param)',    $rsm);

步骤三:设置参数并执行查询 (setParameters & getArrayResult)

与旧方法类似,你可以使用setParameters()方法来绑定查询参数。

执行查询并获取结果时,不再使用fetchAllAssociative(),而是使用getArrayResult()。getArrayResult()方法会根据你在ResultSetMapping中定义的规则,将查询结果组织成一个关联数组的集合。

$query->setParameters([":param" => "test"]);$results = $query->getArrayResult();

完整示例代码

结合上述步骤,以下是调用存储过程并获取数组结果的完整现代化代码:

entityManager = $entityManager;    }    /**     * 调用存储过程并获取标量结果     *     * @param string $paramValue 存储过程参数     * @return array 结果数组     */    public function callStoredProcedureWithScalarResult(string $paramValue): array    {        // 1. 定义结果集映射        $rsm = new ResultSetMapping();        // 假设存储过程返回一个名为 'my_database_column' 的列        // 我们将其映射到 PHP 数组中的 'myField' 键        $rsm->addScalarResult('my_database_column', 'myField');        // 如果存储过程返回多个列,可以继续添加:        // $rsm->addScalarResult('another_db_column', 'anotherField');        // 2. 创建原生查询        $query = $this->entityManager->createNativeQuery(            'CALL spWithParams(:param)', // 你的存储过程调用语句            $rsm        );        // 3. 设置参数        $query->setParameters([':param' => $paramValue]);        // 4. 执行查询并获取数组结果        $results = $query->getArrayResult();        /*         期望的 $results 结构示例:        [          ['myField' => 'foo'],          ['myField' => 'bar']        ]        */        return $results;    }}

注意事项与总结

数据库列名与映射: 确保addScalarResult()中第一个参数$columnName与数据库中存储过程返回的实际列名完全匹配。大小写敏感性取决于你的数据库配置。灵活性: 这种方法非常灵活,你可以根据存储过程返回的不同列定义多个addScalarResult(),以构建复杂的数组结构。性能: 对于不需要实体对象、仅需原始数据的场景,使用getArrayResult()通常比getResult()(用于实体对象)更高效,因为它避免了额外的对象实例化和ORM开销。错误处理: 与所有数据库操作一样,建议在实际应用中加入适当的错误处理机制,例如try-catch块来捕获DBALException或ORMException。替代execute(): 在此方案中,NativeQuery对象的getArrayResult()方法内部已经包含了执行查询的逻辑,因此不再需要单独调用execute()方法。

通过采用ResultSetMapping和createNativeQuery,开发者可以优雅地处理Doctrine中的原生SQL查询和存储过程调用,避免使用弃用方法,并确保代码的现代化和可维护性。这种方法提供了一个清晰且强大的接口,用于在不涉及实体映射的情况下获取结构化的数组结果。

以上就是Doctrine原生SQL与存储过程调用:弃用方法的现代化实践的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1331067.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Yii2 GridView URL参数清理与优化教程
上一篇 2025年12月12日 17:10:14
Laravel 自定义限流中间件:灵活处理请求超限
下一篇 2025年12月12日 17:10:28

相关推荐

  • 使用 Appium 实现 Gmail OTP 验证自动化

    使用 Appium 实现 Gmail OTP 验证自动化使用 Appium 实现 Gmail OTP 验证自动化使用 Appium 实现 Gmail OTP 验证自动化使用 Appium 实现 Gmail OTP 验证自动化

    本文档旨在指导开发者如何使用 Appium 自动化测试移动应用中的 Gmail OTP (One-Time Password) 验证流程。我们将探讨如何通过 Appium 定位 OTP 输入框,并使用获取到的 OTP 值进行输入,从而完成验证流程的自动化。 定位 OTP 输入框 在 Appium 中…

    2026年9月24日 • 用户投稿
    200
  • FydeOS v21 发布,升级至 r138,更强的启动器、即圈即搜和无障碍功能

    FydeOS v21 发布,升级至 r138,更强的启动器、即圈即搜和无障碍功能FydeOS v21 发布,升级至 r138,更强的启动器、即圈即搜和无障碍功能FydeOS v21 发布,升级至 r138,更强的启动器、即圈即搜和无障碍功能FydeOS v21 发布,升级至 r138,更强的启动器、即圈即搜和无障碍功能

    我们隆重推出 FydeOS v21:Sunlit Epiphany 正式版本!此次发布带来了众多全新功能、更流畅的操作体验以及更强的系统稳定性——致力于为你打造更加高效且精致的使用感受。本次更新还将底层 Chromium OS 从 r132 升级至 r138,让你第一时间获得最新的性能优化与安全补丁…

    2026年9月24日 • 用户投稿
    000
  • 贝壳找房App如何筛选楼层和朝向_贝壳找房楼层朝向筛选方法

    贝壳找房App如何筛选楼层和朝向_贝壳找房楼层朝向筛选方法贝壳找房App如何筛选楼层和朝向_贝壳找房楼层朝向筛选方法贝壳找房App如何筛选楼层和朝向_贝壳找房楼层朝向筛选方法贝壳找房App如何筛选楼层和朝向_贝壳找房楼层朝向筛选方法

    在贝壳找房App中筛选楼层和朝向可快速精准找房。1. 进入二手房或新房页面,点击“筛选”按钮;2. 在“楼层”选项中选择低、中、高楼层或排除顶层/底层;3. 在“朝向”中勾选南、南北通透等偏好;4. 确认后列表仅显示匹配房源;5. 进入详情页查看具体楼层位置、总楼层及朝向信息,结合户型图判断采光。操…

    2026年9月24日 • 用户投稿
    000
  • 如何在Java中实现CompletableFuture异步任务

    CompletableFuture 提供非阻塞异步编程,支持链式调用与任务组合,通过 supplyAsync/runAsync 创建任务,thenApply/thenAccept/thenRun 连接操作,allOf/anyOf 管理多任务,exceptionally/handle 处理异常,避免阻…

    2026年9月24日
    1100
  • DeepSeek-V3.2-Exp 发布,训练推理提效,API 同步降价

    DeepSeek-V3.2-Exp 发布,训练推理提效,API 同步降价DeepSeek-V3.2-Exp 发布,训练推理提效,API 同步降价DeepSeek-V3.2-Exp 发布,训练推理提效,API 同步降价DeepSeek-V3.2-Exp 发布,训练推理提效,API 同步降价

    深度求索正式推出 deepseek-v3.2-exp 模型,该版本为实验性(experimental)更新。 作为通向新一代架构的过渡性尝试,V3.2-Exp 在 V3.1-Terminus 的基础上集成了 DeepSeek Sparse Attention(DSA),引入了一种创新的稀疏注意力机制…

    2026年9月24日 • 用户投稿
    500
  • 全彩3D漫画汉化资源汇总_ACG漫画在线观看地址

    全彩3D漫画汉化资源汇总_ACG漫画在线观看地址全彩3D漫画汉化资源汇总_ACG漫画在线观看地址全彩3D漫画汉化资源汇总_ACG漫画在线观看地址全彩3D漫画汉化资源汇总_ACG漫画在线观看地址

    全彩3D漫画汉化资源可通过manwa.size/booklist平台获取,该网站汇集日漫、韩漫及国创全彩漫画,支持下拉式阅读,界面简洁且适配多端,无需下载即可在线流畅观看。 全彩3D漫画汉化资源汇总_ACG漫画在线观看地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来全彩3D漫画汉化资源…

    2026年9月24日 • 用户投稿
    600
  • TradingAgents-CN— 中文多智能体金融交易决策框架

    TradingAgents-CN— 中文多智能体金融交易决策框架TradingAgents-CN— 中文多智能体金融交易决策框架TradingAgents-CN— 中文多智能体金融交易决策框架TradingAgents-CN— 中文多智能体金融交易决策框架

    TradingAgents-CN是什么 tradingagents-cn是基于多智能体大模型的中文金融交易决策框架,在tauricresearch/tradingagents的基础上进行了开发,为中文用户提供了完整的文档体系和本地化支持。框架模拟真实交易公司的专业分工和协作决策流程,通过多个专业化a…

    2026年9月24日 • 用户投稿
    800
  • 使用 Java 读取文件并处理编码问题的实用指南

    使用 Java 读取文件并处理编码问题的实用指南使用 Java 读取文件并处理编码问题的实用指南使用 Java 读取文件并处理编码问题的实用指南使用 Java 读取文件并处理编码问题的实用指南

    本文旨在帮助开发者理解如何在 Java 中以字节方式读取文件,并正确处理字符编码问题。文章将详细介绍如何使用 FileInputStream 读取文件,以及如何在将字节转换为字符串时指定正确的编码方式,避免出现乱码问题。此外,还将讨论如何按固定大小的块读取文件,并提供代码示例进行演示。 理解字节流和…

    2026年9月24日 • 用户投稿
    000
  • 神马搜索App图片编辑集成详解_神马搜索App搜索后处理技巧

    神马搜索App图片编辑集成详解_神马搜索App搜索后处理技巧神马搜索App图片编辑集成详解_神马搜索App搜索后处理技巧神马搜索App图片编辑集成详解_神马搜索App搜索后处理技巧神马搜索App图片编辑集成详解_神马搜索App搜索后处理技巧

    神马搜索App支持图片编辑,长按图片选择“编辑图片”可进入裁剪、旋转、添加文字或涂鸦功能,便于用户调整构图与标注内容。 如果您在使用神马搜索App时,希望对搜索结果中的图片进行编辑或处理,可以直接利用其内置的图片编辑功能。以下是具体的操作步骤和技巧。 本文运行环境:华为Mate 60 Pro,Har…

    2026年9月24日 • 用户投稿
    700
  • 快手视频如何增加点赞_快手视频增加点赞的实用方法

    快手视频如何增加点赞_快手视频增加点赞的实用方法快手视频如何增加点赞_快手视频增加点赞的实用方法快手视频如何增加点赞_快手视频增加点赞的实用方法快手视频如何增加点赞_快手视频增加点赞的实用方法

    提升快手视频点赞量需优化封面标题、参与热门话题、使用粉条推广、加强观众互动、注重内容质量。1. 选用精彩画面作封面,标题用疑问句或数字吸引点击;2. 参与“挑战榜”等热门活动并添加话题标签;3. 通过快手粉条设置推广目标为点赞评论,提升曝光;4. 视频结尾提问并及时回复评论,增强粉丝粘性;5. 保证…

    2026年9月24日 • 用户投稿
    000
  • sublime怎么配置React开发环境_sublime搭建React开发环境步骤

    sublime怎么配置React开发环境_sublime搭建React开发环境步骤sublime怎么配置React开发环境_sublime搭建React开发环境步骤sublime怎么配置React开发环境_sublime搭建React开发环境步骤sublime怎么配置React开发环境_sublime搭建React开发环境步骤

    首先安装Package Control,再通过它安装Babel、Emmet、SublimeLinter等插件;接着将.js/.jsx文件语法设为JavaScript (Babel)以支持JSX高亮;然后配置ESLint实现代码检查;最后可选配置构建系统运行npm start命令。 要在 Sublim…

    2026年9月24日 • 用户投稿
    000
  • 神马搜索App夜间模式使用详解_神马搜索App护眼设置优化

    神马搜索App夜间模式使用详解_神马搜索App护眼设置优化神马搜索App夜间模式使用详解_神马搜索App护眼设置优化神马搜索App夜间模式使用详解_神马搜索App护眼设置优化神马搜索App夜间模式使用详解_神马搜索App护眼设置优化

    开启夜间模式可降低神马搜索App的屏幕亮度与蓝光,缓解暗光环境下的视觉疲劳。首先进入“我的”-“设置”-“显示与字体”,开启夜间模式;随后可设置定时切换,如晚9点至早7点自动启用;接着调节夜间亮度与对比度,匹配环境光线;最后根据偏好自定义夜间主题颜色,如深蓝或墨绿,提升观感舒适度。 如果您在夜间或光…

    2026年9月24日 • 用户投稿
    100
  • php-gd怎么销毁图像资源_php-gd释放内存中的图像

    使用imagedestroy()函数销毁PHP-GD图像资源以避免内存泄漏。创建的资源如$image需在处理后调用imagedestroy($image)释放,尤其在循环中应每轮结束前销毁资源,推荐结合is_resource()判断有效性,遵循“谁创建,谁销毁”原则,确保内存高效管理。 在使用 PH…

    2026年9月24日
    000
  • 夸克下载的电子书在哪个文件夹_夸克小说与电子书缓存位置

    夸克下载的电子书在哪个文件夹_夸克小说与电子书缓存位置夸克下载的电子书在哪个文件夹_夸克小说与电子书缓存位置夸克下载的电子书在哪个文件夹_夸克小说与电子书缓存位置夸克下载的电子书在哪个文件夹_夸克小说与电子书缓存位置

    夸克浏览器下载的电子书通常存于设备Download文件夹中,可经文件管理进入内部存储查找“Quark”子目录;在线阅读缓存则位于/Android/data/com.quark.browser/files下的Cache或Book目录,多为加密.dat文件;导出已下载电子书需通过App内书架的导出或分享…

    2026年9月24日 • 用户投稿
    500
  • MAC的Siri无法使用怎么办_macOS Siri功能故障排查与修复

    MAC的Siri无法使用怎么办_macOS Siri功能故障排查与修复MAC的Siri无法使用怎么办_macOS Siri功能故障排查与修复MAC的Siri无法使用怎么办_macOS Siri功能故障排查与修复MAC的Siri无法使用怎么办_macOS Siri功能故障排查与修复

    首先检查网络连接是否稳定,确认Siri服务状态正常,接着在系统设置中启用Siri并授予麦克风权限,通过终端重启Siri进程,必要时重置NVRAM/PRAM,最后创建新用户账户排除配置损坏问题。 如果您在使用Mac时发现Siri无法响应或功能异常,可能是由于网络连接、系统设置或权限问题导致。以下是排查…

    2026年9月24日 • 用户投稿
    000
  • 京东plus月卡能领双11券吗?京东plus有月卡吗

    京东plus月卡能领双11券吗?京东plus有月卡吗京东plus月卡能领双11券吗?京东plus有月卡吗京东plus月卡能领双11券吗?京东plus有月卡吗京东plus月卡能领双11券吗?京东plus有月卡吗

    京东PLUS月卡用户可领双11大额券,需在优惠期内保持会员有效,通过“我的-PLUS会员”进入领券中心,按时领取满减券并结合红包口令提升优惠。 如果您想在短时间内享受京东PLUS会员的专属优惠,但又不想长期付费,可能会考虑月卡服务。关于京东PLUS月卡是否能领取双11大额优惠券的问题,以下是相关信息…

    2026年9月24日 • 用户投稿
    000
  • Java中实现PDF文档并排对比及差异高亮显示:使用pdfcompare库

    Java中实现PDF文档并排对比及差异高亮显示:使用pdfcompare库Java中实现PDF文档并排对比及差异高亮显示:使用pdfcompare库Java中实现PDF文档并排对比及差异高亮显示:使用pdfcompare库Java中实现PDF文档并排对比及差异高亮显示:使用pdfcompare库

    本文介绍了如何在Java环境中,利用开源库pdfcompare实现两个PDF文档的并排对比,并独立高亮显示其差异。针对传统方案合并PDF的痛点,pdfcompare提供了一种优雅的解决方案,确保原始文档结构不变,仅在各自副本中标记出不同之处,满足特定业务需求。 1. 背景与挑战 在处理文档版本控制或…

    2026年9月24日 • 用户投稿
    1100
  • Debian系统如何实现GitLab的高可用性

    Debian系统如何实现GitLab的高可用性Debian系统如何实现GitLab的高可用性Debian系统如何实现GitLab的高可用性Debian系统如何实现GitLab的高可用性

    在debian系统上实现gitlab的高可用性可以通过以下几种方法: 通过Kubernetes进行部署 安装Redis:利用Helm部署Redis,并配置持久化存储以确保数据的持久性。安装PostgreSQL:同样通过Helm部署PostgreSQL,并设置主从复制或集群模式,以确保数据的高可用性。…

    2026年9月24日 • 用户投稿
    700
  • 如何在Debian 10(Buster)Linux上安装MySQL

    了解如何在debian 10(buster)linux上安装mysql。本指南将引导您完成在最新版本的debian系统上安装mysql 8或mysql 5.7的步骤。 第1步 – 准备工作 首先,确保您拥有Debian 10系统的shell访问权限。如果是远程系统,可以通过SSH连接。W…

    2026年9月24日
    1000
  • sublime怎么去除购买弹窗_sublime关闭试用版购买提示的方法

    sublime怎么去除购买弹窗_sublime关闭试用版购买提示的方法sublime怎么去除购买弹窗_sublime关闭试用版购买提示的方法sublime怎么去除购买弹窗_sublime关闭试用版购买提示的方法sublime怎么去除购买弹窗_sublime关闭试用版购买提示的方法

    答案:可通过修改hosts文件、清理授权信息或降级版本缓解Sublime Text启动弹窗。具体操作包括屏蔽验证域名license.sublimehq.com、重命名Local目录下的Registry.dat文件,或安装旧版本并关闭更新提示,但建议支持正版以获得更好体验。 Sublime Text …

    2026年9月24日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信