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 字符串作为第一个参数,以及一个可选的绑定数组作为第二个参数(用于安全地处理用户输入)。

基本语法:

Video Ocean
Video Ocean

人人皆导演,让视频创作变得轻松自如

下载
use Illuminate\Support\Facades\DB;

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

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

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

假设我们有一个非常复杂的 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():

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class ReportController extends Controller
{
    public function showUserUsageReport()
    {
        // 定义复杂的SQL查询字符串
        // 在实际应用中,对于如此长的SQL,建议将其放在单独的文件或常量中以保持代码整洁
        $sqlQuery = "
            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;
        ";

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

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

将查询结果传递到视图

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

339

2024.04.09

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

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

293

2024.04.09

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

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

772

2024.04.09

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

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

385

2024.04.10

laravel入门教程
laravel入门教程

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

140

2025.08.05

laravel实战教程
laravel实战教程

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

85

2025.08.05

laravel面试题
laravel面试题

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

79

2025.08.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

418

2026.03.04

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

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

精品课程

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

共137课时 | 13.3万人学习

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

共6课时 | 11.3万人学习

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

共13课时 | 1.0万人学习

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

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