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
如何在Laravel中将复杂原生SQL查询转换为查询构建器并实现分页_创想鸟

如何在Laravel中将复杂原生SQL查询转换为查询构建器并实现分页

如何在Laravel中将复杂原生SQL查询转换为查询构建器并实现分页

本教程详细阐述了如何在Laravel框架中将包含子查询、聚合函数及条件逻辑的复杂原生SQL语句转换为查询构建器(Query Builder)操作。通过利用DB::raw()处理复杂表达式和joinSub()管理子查询,我们不仅能提升代码的可读性和可维护性,还能轻松实现分页功能,有效应对大数据量场景,确保查询的灵活性与高效性。

1. 转换原生SQL到Laravel查询构建器的必要性

laravel开发中,尽管原生sql查询提供了最大的灵活性,但它往往缺乏框架提供的便利性,尤其是在处理数据分页、参数绑定和代码可读性方面。将原生sql转换为laravel的查询构建器,能够带来以下显著优势:

提升可读性和可维护性: 查询构建器使用链式调用,代码结构更清晰,易于理解和修改。增强安全性: 查询构建器会自动处理参数绑定,有效防止SQL注入攻击。方便集成框架功能: 轻松使用Laravel提供的分页(paginate())、软删除、模型事件等高级功能。跨数据库兼容性: 查询构建器抽象了底层数据库差异,使得代码在不同数据库之间迁移更为便捷。

对于需要处理大量数据且需要分页的复杂查询,转换到查询构建器是提升开发效率和应用性能的关键一步。

2. 核心转换策略:DB::raw()与joinSub()的应用

面对包含子查询、聚合函数和条件逻辑的复杂原生SQL,Laravel查询构建器提供了DB::raw()和joinSub()两个强大工具来应对。

DB::raw(): 当查询构建器没有直接对应的方法来表达特定的SQL函数或复杂表达式时,可以使用DB::raw()来插入原生的SQL片段。这对于聚合函数(如MIN, COUNT, SUM)、条件表达式(如IF语句)以及其他数据库特定函数尤为有用。joinSub(): 该方法允许你将一个完整的查询构建器实例作为子查询加入到主查询中,并像普通表一样进行连接操作。这对于需要预先聚合或筛选数据,然后与主表连接的场景非常适用。

3. 实例解析:复杂查询的转换过程

我们以一个具体的复杂查询为例,演示如何将其转换为Laravel查询构建器。原始查询涉及两个表cp_counsel和cp_cases_counsel,包含子查询、多个聚合函数、条件聚合以及分组操作,并最终需要分页。

原始SQL逻辑分析:

子查询 cpCounsel: 从cp_counsel表中选择enrolment_number作为id,并获取每个enrolment_number对应的最小counsel值,然后按enrolment_number分组。主查询 counsels:从cp_cases_counsel表开始。将子查询cpCounsel作为别名A连接进来,连接条件是A.id = T.counsel_id。根据A.counsel进行模糊搜索。选择counsel_id、counsel,并计算多项聚合数据,包括总数、最高法院案件数(按角色区分)、上诉法院案件数(按角色区分)。这些聚合涉及到COUNT和SUM与IF条件判断的结合。按T.counsel_id和A.counsel分组。最后对结果进行分页。

转换为Laravel查询构建器:

search_term 已经定义/** * 步骤1:构建子查询 (cpCounsel) * 对应 SQL: * SELECT A.enrolment_number AS id, MIN(A.counsel) AS counsel * FROM cp_counsel AS A * GROUP BY enrolment_number */$cpCounsel = DB::table('cp_counsel as A')    ->select([        'A.enrolment_number as id',        DB::raw('MIN(A.counsel) as counsel'), // 使用 DB::raw() 处理 MIN 函数    ])    ->groupBy('enrolment_number');/** * 步骤2:构建主查询 (counsels) * 对应 SQL: * SELECT T.counsel_id, A.counsel, COUNT(T.counsel_id) AS total, *        SUM(IF(T.court_id = 2, 1, 0)) AS supreme_court_cases, *        ... (其他条件聚合) * FROM cp_cases_counsel AS T * JOIN ({子查询}) AS A ON A.id = T.counsel_id * WHERE A.counsel LIKE '%search_term%' * GROUP BY T.counsel_id, A.counsel */$counsels = DB::table('cp_cases_counsel as T')    // 使用 joinSub() 将子查询作为虚拟表 A 连接    ->joinSub($cpCounsel, 'A', function ($join) {        $join->on('A.id', '=', 'T.counsel_id');    })    // 添加 where 条件    ->where('A.counsel', 'like', "%{$request->search_term}%")    ->select([        'T.counsel_id',        'A.counsel',        DB::raw('COUNT(T.counsel_id) as total'), // 总数聚合        // 最高法院案件数及其角色区分的条件聚合        DB::raw('SUM(if(T.court_id = 2, 1, 0)) as supreme_court_cases'),        DB::raw('SUM(if(T.court_id = 2, 1, 0) AND if(T.counsel_role = 1, 1, 0)) as supreme_court_cases_as_lead'),        DB::raw('SUM(if(T.court_id = 2, 1, 0) AND if(T.counsel_role = 2, 1, 0)) as supreme_court_cases_as_supporting'),        // 上诉法院案件数及其角色区分的条件聚合        DB::raw('SUM(if(T.court_id = 1, 1, 0)) as appeal_court_cases'),        DB::raw('SUM(if(T.court_id = 1, 1, 0) AND if(T.counsel_role = 1, 1, 0)) as appeal_court_cases_as_lead'),        DB::raw('SUM(if(T.court_id = 1, 1, 0) AND if(T.counsel_role = 2, 1, 0)) as appeal_court_cases_as_supporting'),    ])    // 分组    ->groupBy('T.counsel_id', 'A.counsel')    // 实现分页    ->paginate(15);// $counsels 现在是一个 IlluminatePaginationLengthAwarePaginator 实例// 你可以直接在视图中使用它来渲染分页链接和数据

4. 注意事项与最佳实践

何时使用DB::raw(): 仅当查询构建器没有直接对应的方法时才使用DB::raw()。过度使用DB::raw()会降低代码的可读性,并可能丧失查询构建器提供的一些安全性检查。例如,简单的COUNT(*)可以直接用->count(),而不需要DB::raw(‘COUNT(*)’)。性能考量: 尽管查询构建器有助于构建复杂查询,但查询本身的性能仍然取决于SQL的优化。对于非常大的数据集,确保表有正确的索引,并考虑数据库层面的优化。可读性与复杂性平衡: 对于极其复杂的聚合逻辑,有时将其分解为多个较简单的查询或视图,然后再进行连接,可能会提高可读性和调试效率。调试查询: 在开发过程中,可以使用toSql()方法查看查询构建器生成的原生SQL,或者使用dd()打印查询结果,这对于调试非常有用。

// 查看生成的 SQL 语句dd($counsels->toSql());// 查看绑定参数dd($counsels->getBindings());

Eloquent ORM: 对于更面向对象的开发,如果你的表有对应的Eloquent模型,可以考虑使用Eloquent关系和集合方法来处理数据。然而,对于这种包含大量聚合和子查询的复杂报表类查询,查询构建器通常是更直接和高效的选择。

5. 总结

通过本教程,我们了解了如何将复杂原生SQL查询转换为Laravel查询构建器。核心在于灵活运用DB::raw()来嵌入原生SQL片段,以及使用joinSub()来处理子查询。这种转换不仅提升了代码的清晰度、可维护性和安全性,更重要的是,它使得Laravel强大的分页功能能够无缝地应用于这些复杂的查询结果,从而有效管理和展示大量数据。掌握这些技巧,将极大地提高你在Laravel中处理数据库操作的能力。

以上就是如何在Laravel中将复杂原生SQL查询转换为查询构建器并实现分页的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
PHP常用框架如何集成日志分析与监控系统 PHP常用框架监控功能的实用方法
上一篇 2025年12月11日 07:36:23
使用 Vimeo PHP-SDK 获取受域名限制的私有视频
下一篇 2025年12月11日 07:36:37

相关推荐

  • 字节入局,AR眼镜掀起新“风口”?

    近日,关于老凤祥与字节跳动合作推出AI眼镜的消息在网络上引发热议。据相关媒体报道,老凤祥计划联合字节跳动旗下的火山引擎共同开发多款AI眼镜,并由豆包大模型提供技术支持,预计将在今年7月正式发布。 对此,6月12日,火山引擎方面进行了澄清。其负责人表示,并未有与老凤祥合作研发AI智能眼镜的计划。而豆包…

    2026年9月23日
    000
  • 在无Maven或Eclipse环境下手动构建Java Web应用WAR包的教程

    本教程详细介绍了如何在不依赖Maven或Eclipse等集成开发环境的情况下,为Java Web应用程序手动生成WAR(Web Application Archive)文件。文章首先阐述了WAR文件的基本结构,随后通过一个Ant构建脚本的实例,指导读者完成从源代码编译、文件组织到最终WAR包生成的全…

    2026年9月23日
    000
  • 如何授予MySQL用户特定权限?

    如何授予MySQL用户特定权限?如何授予MySQL用户特定权限?如何授予MySQL用户特定权限?如何授予MySQL用户特定权限?

    要授予mysql用户特定权限,需使用grant语句并遵循最小权限原则。1. 登录mysql,使用root或有grant权限的账户;2. 使用grant 权限 on 数据库名.表名 to ‘用户名’@’主机名’语法授予权限,如select、insert等…

    2026年9月23日 用户投稿
    000
  • AdobePhotoshop的AI混合工具怎么用?掌握智能图像编辑的教程

    Photoshop的AI混合工具以生成式填充和神经网络滤镜为代表,通过语义理解实现智能图像融合。生成式填充可依据文本提示添加、移除或扩展内容,自动匹配光影与纹理;神经网络滤镜如和谐化则优化颜色与光照匹配。与传统基于像素计算的混合模式不同,AI工具理解图像内容,实现“生成并融合”。使用时需精准输入英文…

    2026年9月23日
    100
  • windows10怎么把任务栏设置成透明_windows10任务栏透明效果设置方法

    可通过系统设置、注册表或第三方工具实现Windows 10任务栏透明。一、在“个性化-颜色”中开启“透明效果”;二、在注册表新建TaskbarAcrylicOpacity值并设为0-100调节透明度,重启生效;三、使用TranslucentTB软件实现多模式透明控制,支持常透明或悬停显示。 如果您希…

    2026年9月23日
    000
  • Windows安装过程中蓝屏INACCESSIBLE_BOOT_DEVICE怎么办?

    1、蓝屏“INACCESSIBLE_BOOT_DEVICE”通常因SATA模式不匹配或驱动缺失导致;2、进入BIOS将SATA模式从RAID改为AHCI可解决兼容性问题;3、安装时加载主板存储控制器驱动以识别NVMe或RAID磁盘;4、使用diskpart命令清理磁盘并转换为GPT(UEFI)或MB…

    2026年9月23日
    000
  • Linux安装Redis数据库,无需公网IP实现远程连接

    Linux安装Redis数据库,无需公网IP实现远程连接Linux安装Redis数据库,无需公网IP实现远程连接Linux安装Redis数据库,无需公网IP实现远程连接Linux安装Redis数据库,无需公网IP实现远程连接

    redis作为一种高效的key-value数据库,因其将数据存储在内存中而具备极高的读写速度,广泛应用于多种场景中。以下将详细介绍如何在centos 8的linux虚拟机上搭建redis数据库,并利用cpolar实现内网穿透以便通过公网访问。 在Linux(CentOS 8)上安装Redis数据库 …

    2026年9月23日 用户投稿
    000
  • 谷歌为 Gemini CLI 带来扩展功能

    谷歌旗下的 AI 编程助手 Gemini CLI 最近推出了名为“扩展”的全新功能。官方表示,这一更新让用户能够“接入常用工具,并定制属于自己的 AI 命令行体验”。现在,任何开发者都可以发布扩展程序,无需经过谷歌的审核批准即可上线使用。 目前扩展库中已提供超过 50 款扩展,涵盖多种实用场景。例如…

    2026年9月23日
    000
  • VSCode文件编码识别错误怎么办?VSCode编码设置调整方法

    VSCode文件编码识别错误怎么办?VSCode编码设置调整方法VSCode文件编码识别错误怎么办?VSCode编码设置调整方法VSCode文件编码识别错误怎么办?VSCode编码设置调整方法VSCode文件编码识别错误怎么办?VSCode编码设置调整方法

    vscode文件编码识别错误导致乱码问题可通过调整编码设置解决。1.查看右下角编码显示,若不对则点击选择“通过编码重新打开”,尝试utf-8、gbk等常见编码直至显示正常;2.如手动无效可启用“自动检测”功能;3.修改vscode默认编码(设置中搜索“files.encoding”并设为常用格式如u…

    2026年9月23日 用户投稿
    100
  • 如何恢复未保存的WPS格式文档_WPS未保存文档恢复操作技巧

    首先尝试WPS自动恢复功能,重新打开软件后查看“文档恢复”面板;若无效,可手动查找C:Users当前用户名AppDataLocalKingsoftWPS Officecache目录下的临时文件;若启用云端同步,可通过“备份与恢复”中的历史版本找回;还可使用系统搜索*.asd文件定位自动保存的副本。 …

    2026年9月23日
    100
  • 绘蛙AI修图怎样优化旅游照片?旅行社合作方案

    绘蛙ai修图的核心优势在于智能识别与校正,能自动调整白平衡、曝光和色彩饱和度,解决光线不佳或色彩偏差问题;2. 提供一键美化与风格化处理,内置“电影感”“清新自然”等风格,综合调整光影、对比度与锐度,提升照片视觉质感;3. 具备细节增强与瑕疵修复能力,可智能去除背景杂物、降噪、锐化,并自然修复人像瑕…

    2026年9月23日
    000
  • 谷歌浏览器如何将网页添加到阅读清单_谷歌浏览器添加网页到阅读清单方法

    谷歌浏览器支持通过地址栏按钮、右键菜单、主菜单和快捷键四种方式将网页添加到阅读清单。1、点击地址栏右侧“添加到阅读清单”图标即可保存;2、在页面空白处右键选择“添加页面到阅读清单”;3、通过三点菜单进入书签子菜单选择“添加到阅读清单”;4、使用Command+Shift+D(Mac)或Ctrl+Sh…

    2026年9月23日
    100
  • 图片库空间不足怎么办_图片库空间不足如何压缩图片详细步骤

    压缩图片可有效节省空间,推荐使用TinyPNG等在线工具批量处理,或用Photoshop、XnConvert进行精准控制,手机用户可通过专用App或快捷指令一键压缩,配合云存储与格式转换更高效。 图片库空间不足时,压缩图片是节省空间最直接有效的方法。不需要删除照片,通过合理压缩,既能保留视觉质量,又…

    2026年9月23日
    100
  • 苹果手机官网查询门户 苹果查询官网手机入口

    苹果查询官网手机入口是https://www.apple.com.cn,用户可通过该网站查询设备信息、技术支持及配件服务,包括序列号验证、保修状态、维修预约和原厂配件真伪核验等功能。 苹果手机官网查询门户在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来苹果查询官网手机入口,感兴趣的网友一起…

    2026年9月23日
    100
  • 支持多种CPU调整外频!微星B850MPOWER主板图赏

    支持多种CPU调整外频!微星B850MPOWER主板图赏支持多种CPU调整外频!微星B850MPOWER主板图赏支持多种CPU调整外频!微星B850MPOWER主板图赏支持多种CPU调整外频!微星B850MPOWER主板图赏

    10月9日最新消息,微星b850m power主板已正式上市,定价为1599元,首发时迅速售罄,目前仍处于供不应求状态,需参与抢购才能入手。 这款热门新品现已抵达我们评测室,接下来为大家带来详细的图赏内容。 微星B850M POWER主板采用高端的8层服务器级PCB设计,配备双8PIN供电接口,并使…

    2026年9月23日 用户投稿
    000
  • Deepseek 满血版联动 Typinator Pro,创建复杂文本模板​

    Deepseek 满血版联动 Typinator Pro,创建复杂文本模板​Deepseek 满血版联动 Typinator Pro,创建复杂文本模板​Deepseek 满血版联动 Typinator Pro,创建复杂文本模板​Deepseek 满血版联动 Typinator Pro,创建复杂文本模板​

    将 ai 与 typinator 联动可打造高效文本模板系统。1. 使用 deepseek 等 ai 工具生成结构化内容,如邮件草稿;2. 将生成内容调整为 typinator 变量格式(如 %|name%);3. 导入 typinator 并设置快捷短语,实现一键插入。典型场景包括批量写邮件、报告…

    2026年9月23日 用户投稿
    000
  • Vscode怎么批量修改变量?Vscode变量重命名操作指南

    Vscode怎么批量修改变量?Vscode变量重命名操作指南Vscode怎么批量修改变量?Vscode变量重命名操作指南Vscode怎么批量修改变量?Vscode变量重命名操作指南Vscode怎么批量修改变量?Vscode变量重命名操作指南

    vscode批量修改变量的方法是选中变量按f2输入新名回车,但要更精确控制重命名范围可采取以下措施:1.使用“查找和替换”功能(ctrl+h),结合正则表达式限定匹配范围;2.使用语言支持的“重构”功能(右键→重构→重命名),基于语义分析避免误改;3.安装增强重命名插件提升功能;4.利用静态代码分析…

    2026年9月23日 用户投稿
    000
  • 微软免费文件恢复工具介绍

    微软免费文件恢复工具介绍微软免费文件恢复工具介绍微软免费文件恢复工具介绍微软免费文件恢复工具介绍

    现在好了,最近微软在 windows 10 应用商店中上架了一款免费的数据删除恢复工具 windows file recovery,猿妹再也不用担心误删文件了。 Windows File Recovery基于命令行程序设计,大小仅有8.26MB,所有Windows 10用户均可免费下载使用。 无论是…

    2026年9月23日 用户投稿
    100
  • VSCode精简配置Perl:语法检查、中文编码、正则调试

    vscode中perl语法检查不生效的主要原因是perl解释器路径未正确配置或缺失,解决方法是在settings.json中明确设置”perl.perlpath”指向正确的perl可执行文件;其次是因缺少cpan模块导致检查失败,需安装对应模块;此外,多个perl扩展冲突、大…

    2026年9月23日
    000
  • Yandex对俄贸易专用搜索 官方网站入口一键直达

    Yandex对俄贸易专用搜索官网为https://yandex.com/,提供俄语内容索引、企业信息查找、地图定位及自动翻译等功能,支持跨境业务拓展与市场分析。 Yandex对俄贸易专用搜索官方网站入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来Yandex对俄贸易专用搜索官方网站入口…

    2026年9月23日
    300

发表回复

登录后才能评论
关注微信