0

0

Laravel Eloquent 中整合 SUM 聚合函数与多列查询的实践指南

心靈之曲

心靈之曲

发布时间:2025-11-12 13:07:00

|

826人浏览过

|

来源于php中文网

原创

laravel eloquent 中整合 sum 聚合函数与多列查询的实践指南

本教程详细阐述了如何在 Laravel Eloquent 中将包含 `SUM` 聚合函数和 `GROUP BY` 的复杂原始 SQL 查询转换为可读性更强的查询构建器语句。核心在于利用 `DB::raw()` 方法在 `select()` 子句中正确集成聚合函数,同时保留其他所需字段,从而实现数据汇总与明细查询的有效结合。

引言:从原始 SQL 到 Eloquent 的挑战

在 Web 开发中,我们经常需要处理涉及数据聚合的复杂查询,例如计算某个分组的总和、平均值或计数。当使用原始 SQL 语句时,这通常通过 SUM()、COUNT() 等聚合函数结合 GROUP BY 子句来实现。例如,以下是一个典型的原始 SQL 查询,用于计算每个产品的购物车数量总和,并获取产品详情:

SELECT SUM(carts.quantity) as couuntq, carts.productid, products.name, products.price, products.gallary
FROM carts, products
WHERE carts.productid = products.id
  AND carts.userid = [userid]
GROUP BY carts.productid
ORDER BY carts.productid;

尽管原始 SQL 功能强大,但在 Laravel 项目中,我们更倾向于使用 Eloquent ORM 或查询构建器来提高代码的可读性、可维护性和安全性。然而,将上述包含聚合函数和多列选择的复杂 SQL 转换为 Eloquent 语句时,开发者常会遇到挑战。

理解聚合函数在 Eloquent 中的应用

Laravel 查询构建器提供了一些便捷的聚合方法,如 sum()、count()、avg()、max() 和 min()。这些方法通常作为查询的终结器(terminal methods),意味着它们会直接执行查询并返回一个单一的聚合结果。例如:

// 获取所有购物车中商品数量的总和
$totalQuantity = DB::table('carts')->sum('quantity');

// 获取满足条件的用户购物车商品数量总和
$userTotalQuantity = DB::table('carts')
                        ->where('userid', $userid)
                        ->sum('quantity');

这种用法非常直接,但它只返回一个标量值。当我们需要在 SELECT 子句中同时包含聚合结果(如 SUM(quantity))和分组后的其他列(如 productid, product.name)时,直接使用 ->sum('column') 将不再适用,因为它会覆盖或阻止其他列的选取。

解决方案:利用 DB::raw() 整合聚合函数

为了在 SELECT 子句中灵活地集成聚合函数和其他列,Laravel 查询构建器提供了 DB::raw() 方法。DB::raw() 允许你在查询构建器中插入任意的原始 SQL 片段,这为处理复杂场景提供了极大的便利。

核心思想是:将聚合函数表达式(例如 SUM(carts.quantity) as couuntq)作为 DB::raw() 的参数,然后将其与你希望选择的其他列一同传递给 select() 方法。

use Illuminate\Support\Facades\DB;

// 示例语法
DB::table('your_table')
    ->select(
        DB::raw('SUM(column_name) as alias_name'), // 聚合函数
        'another_column',                           // 其他列
        'yet_another_column'
    )
    // ... 其他查询条件
    ->get();

逐步转换示例

现在,我们将上述原始 SQL 查询逐步转换为 Laravel 查询构建器语句。

原始 SQL 查询回顾:

SELECT SUM(carts.quantity) as couuntq, carts.productid, products.name, products.price, products.gallary
FROM carts, products
WHERE carts.productid = products.id
  AND carts.userid = [userid]
GROUP BY carts.productid
ORDER BY carts.productid;

1. 表连接 (JOIN)

原始 SQL 使用了隐式连接 (FROM carts, products WHERE carts.productid = products.id)。在查询构建器中,我们应使用显式的 join() 方法:

DB::table('carts')
    ->join('products', 'carts.productid', '=', 'products.id')

2. 条件筛选 (WHERE)

筛选条件 carts.userid = [userid] 可以直接使用 where() 方法:

->where('carts.userid', $userid)

注意: 原始 SQL 中的 WHERE carts.productid = products.id 在 JOIN 子句中已经处理,因此在 WHERE 子句中重复此条件是冗余的。在 Eloquent 中,我们应该避免这种冗余,确保 JOIN 语句正确定义连接关系即可。

Glif
Glif

Glif.app 是一个有趣的AI沙盒工具,用于创建名为 glifs 的微型AI生成器,例如自拍生成器、Meme梗图、表情包、漫画、故事等

下载

3. 聚合与选择列 (SELECT with SUM)

这是最关键的一步。我们将 SUM(carts.quantity) as couuntq 包装在 DB::raw() 中,并与 carts.productid, products.name, products.price, products.gallary 一同传递给 select() 方法:

->select(
    DB::raw('SUM(carts.quantity) as couuntq'),
    'carts.productid',
    'products.name',
    'products.price',
    'products.gallary'
)

4. 分组 (GROUP BY)

使用 groupBy() 方法对 carts.productid 进行分组:

->groupBy('carts.productid')

5. 排序 (ORDER BY)

使用 orderBy() 方法对结果进行排序:

->orderBy('carts.productid', 'asc')

6. 获取结果 (GET)

最后,调用 get() 方法执行查询并获取结果集:

->get();

完整的 Eloquent 查询示例

结合以上步骤,完整的 Laravel 查询构建器代码如下:

user()->id; // 如果是认证用户
        // 或者 $userId = $request->route('userId'); // 如果是路由参数

        $results = DB::table('carts')
            ->join('products', 'carts.productid', '=', 'products.id')
            ->select(
                DB::raw('SUM(carts.quantity) as couuntq'),
                'carts.productid',
                'products.name',
                'products.price',
                'products.gallary'
            )
            ->where('carts.userid', $userId)
            ->groupBy('carts.productid')
            ->orderBy('carts.productid', 'asc')
            ->get();

        // 返回或处理结果
        return response()->json($results);
    }
}

注意事项与最佳实践

  1. 别名 (Aliases): 为 DB::raw() 表达式中的聚合结果指定清晰的别名(例如 as couuntq),这有助于在处理结果集时更容易地访问数据。

  2. 安全性:DB::raw() 功能强大,但如果将用户直接输入未经处理地拼接到 DB::raw() 中,可能导致 SQL 注入漏洞。在本例中,$userId 作为 where() 方法的第二个参数,Laravel 会自动对其进行参数绑定,从而有效防止 SQL 注入。始终确保任何用户输入在进入 DB::raw() 之前都经过严格的验证和清理。

  3. 调试: 在开发过程中,如果对生成的 SQL 语句有疑问,可以使用 toSql() 和 getBindings() 方法来检查查询构建器实际执行的 SQL 语句及其绑定参数:

    $query = DB::table('carts')
        ->join('products', 'carts.productid', '=', 'products.id')
        ->select(
            DB::raw('SUM(carts.quantity) as couuntq'),
            'carts.productid',
            'products.name',
            'products.price',
            'products.gallary'
        )
        ->where('carts.userid', $userId)
        ->groupBy('carts.productid')
        ->orderBy('carts.productid', 'asc');
    
    // 打印生成的 SQL 语句
    // echo $query->toSql();
    // print_r($query->getBindings());
    
    $results = $query->get();
  4. 其他聚合函数:DB::raw() 的用法不仅限于 SUM()。当你需要 COUNT(), AVG(), MAX(), MIN() 等其他聚合函数与非聚合列一同选择时,也可以采用相同的方式。

总结

通过本教程,我们学习了如何在 Laravel Eloquent 中,利用 DB::raw() 方法有效地将包含 SUM 聚合函数和 GROUP BY 的复杂原始 SQL 查询转换为清晰、可维护的查询构建器语句。掌握 DB::raw() 的使用是 Laravel 开发者处理高级数据库查询的关键技能,它在保持 Eloquent 优雅性的同时,提供了足够的灵活性来应对复杂的业务需求。

相关专题

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

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

313

2024.04.09

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

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

270

2024.04.09

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

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

363

2024.04.09

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

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

363

2024.04.10

laravel入门教程
laravel入门教程

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

80

2025.08.05

laravel实战教程
laravel实战教程

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

63

2025.08.05

laravel面试题
laravel面试题

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

62

2025.08.05

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

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

674

2023.10.12

俄罗斯搜索引擎Yandex最新官方入口网址
俄罗斯搜索引擎Yandex最新官方入口网址

Yandex官方入口网址是https://yandex.com;用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1

2025.12.29

热门下载

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

精品课程

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

共137课时 | 8.1万人学习

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

共6课时 | 6.9万人学习

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

共13课时 | 0.8万人学习

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

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