0

0

在 Laravel 中高效执行复杂原生 SQL 查询

霞舞

霞舞

发布时间:2025-11-21 12:59:42

|

133人浏览过

|

来源于php中文网

原创

在 Laravel 中高效执行复杂原生 SQL 查询

laravel 的 eloquent orm 或查询构建器无法满足高度定制化的复杂 sql 查询需求时,db::select() 方法提供了一种直接且高效的解决方案。本文将指导您如何在 laravel 应用程序中无缝集成并执行原生 sql 语句,处理复杂的联接、聚合与条件筛选,确保数据检索的灵活性与性能。

理解 Laravel 中的数据库操作

Laravel 提供了强大的数据库抽象层,包括 Eloquent ORM 和查询构建器(Query Builder),它们极大地简化了数据库交互。对于大多数 CRUD 操作和中等复杂度的查询,这些工具都能提供优雅且高效的解决方案。然而,在面对某些极端复杂或高度优化的 SQL 语句时,例如涉及多表复杂联接、自定义函数、高级聚合或复杂的 HAVING 子句时,尝试将这些逻辑完全转换为查询构建器语法可能会变得异常困难,甚至导致代码冗长、难以维护或性能不佳。

在这种情况下,Laravel 允许开发者直接执行原生 SQL 查询,从而在不脱离框架环境的前提下,获得最大的灵活性和控制力。

何时选择原生 SQL 查询

选择使用原生 SQL 而非查询构建器或 Eloquent,通常基于以下考量:

  1. 查询复杂度极高: 当查询涉及多个非标准联接、复杂的子查询、自定义数据库函数、递归查询或难以通过构建器表达的 HAVING 条件时。
  2. 性能优化: 对于某些特定的、需要极致性能的报表或数据分析查询,直接编写优化的原生 SQL 可能是最佳选择。
  3. 特定数据库特性: 需要利用数据库特有的函数或语法,而这些特性不被 Laravel 查询构建器普遍支持时。
  4. 现有复杂 SQL 迁移: 当需要将大量已有的、复杂的原生 SQL 语句集成到 Laravel 项目中,且重写成本过高时。

使用 DB::select() 执行原生 SQL

Laravel 的 DB Facade 提供了一个 select() 方法,专门用于执行读取操作的原生 SQL 查询。这个方法非常直观,它接受一个 SQL 字符串作为第一个参数,以及一个可选的绑定数组作为第二个参数(用于安全地处理用户输入)。

基本语法:

use Illuminate\Support\Facades\DB;

$results = DB::select('SELECT * FROM users WHERE active = ?', [1]);

DB::select() 方法返回一个包含 stdClass 对象的数组,每个对象代表查询结果集中的一行。

创一AI
创一AI

AI帮你写短视频脚本

下载

示例:执行复杂的用户会话统计查询

假设我们有一个非常复杂的 SQL 查询,用于统计用户会话的上传、下载总量,并根据特定条件进行过滤和分组。以下是这样一个查询的示例:

SELECT
    ru.external_ref_no AS SID,
    usd.user_name AS Username,
    rs.servicecode AS Package,
    rc.clientdesc AS Entity,
    rc.clientip AS NAS_IP,
    ROUND((ROUND((SUM(usd.FREE_UPLOAD_OCTETS)/1048576)))/1024,2) AS Upload,
    ROUND((ROUND((SUM(usd.FREE_DOWNLOAD_OCTETS)/1048576)))/1024,2) AS Download,
    ROUND((ROUND((SUM(usd.FREE_UPLOAD_OCTETS)/1048576)))/1024,2) + ROUND((ROUND((SUM(usd.FREE_DOWNLOAD_OCTETS)/1048576)))/1024,2) AS Total_Usage
FROM
    user_session_detail usd,
    radservice rs,
    radclient rc,
    radgroup rg,
    raduser ru
WHERE
    ru.username = usd.user_name AND
    rs.serviceid = usd.service_id AND
    rg.groupid = usd.group_id AND
    usd.client_id = rc.clientid AND
    usd.SESSION_START_TIME > '2021-09-30 00.00.01' AND
    usd.SESSION_START_TIME < '2021-09-30 23.59.59'
GROUP BY
    usd.user_name
HAVING
    (ROUND((SUM(usd.FREE_UPLOAD_OCTETS)/1048576)))/1024 + (ROUND((SUM(usd.FREE_DOWNLOAD_OCTETS)/1048576)))/1024 > 15 AND
    (ROUND((SUM(usd.FREE_UPLOAD_OCTETS)/1048576)))/1024 + (ROUND((SUM(usd.FREE_DOWNLOAD_OCTETS)/1048576)))/1024 < 20;

将上述复杂查询集成到 Laravel 中,只需将其作为字符串传递给 DB::select():

 '2021-09-30 00.00.01' AND
                usd.SESSION_START_TIME < '2021-09-30 23.59.59'
            GROUP BY
                usd.user_name
            HAVING
                (ROUND((SUM(usd.FREE_UPLOAD_OCTETS)/1048576)))/1024 + (ROUND((SUM(usd.FREE_DOWNLOAD_OCTETS)/1048576)))/1024 > 15 AND
                (ROUND((SUM(usd.FREE_UPLOAD_OCTETS)/1048576)))/1024 + (ROUND((SUM(usd.FREE_DOWNLOAD_OCTETS)/1048576)))/1024 < 20;
        ";

        // 执行查询
        $results = DB::select($sqlQuery);

        // $results 将是一个包含stdClass对象的数组,每个对象代表一行数据
        // 例如:$results[0]->SID, $results[0]->Username 等
        return view('reports.secretuserlist', compact('results'));
    }
}

将查询结果传递到视图

获取到 $results 数组后,您可以像处理任何其他数据一样,将其传递给 Laravel 的 Blade 视图进行渲染。上述控制器示例

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

316

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

271

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

368

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

368

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

81

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

64

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

67

2025.08.05

数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

676

2023.10.12

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

12

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.6万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号