将原始子查询转换为 Laravel Query Builder 查询

霞舞
发布: 2025-10-03 16:47:30
原创
602人浏览过

将原始子查询转换为 laravel query builder 查询

本文将指导您如何将包含子查询的原始 SQL 查询转换为使用 Laravel Query Builder 的等效查询。通过利用 Laravel 的 fromSub 方法,我们可以构建复杂的嵌套查询,同时保持代码的可读性和可维护性。本文将提供详细步骤和示例代码,帮助您理解和应用这一技术。

在 Laravel 中,Query Builder 提供了强大的工具来构建数据库查询,而无需编写原始 SQL。对于包含子查询的复杂查询,fromSub 方法尤其有用。它允许您将一个 Query Builder 实例作为子查询嵌入到另一个查询中。

使用 fromSub 构建子查询

以下是一个示例,演示如何使用 fromSub 方法将原始 SQL 查询转换为 Laravel Query Builder 查询:

假设我们有以下原始 SQL 查询:

SELECT inventory.EmployeeID,
        inventory.created_date AS OrderDate,
        SUM(inventory.calculation) AS TotalPrice
        FROM ( SELECT i.id AS ItemID,
        o.id AS OrderID,
        o.EmployeeID,
        o.created_date,
        (o.Quantity * i.price) AS calculation
        FROM `stationary_orders` AS o
        LEFT JOIN `stationary_items` AS i ON o.Stationary_ID = i.id
        WHERE o.Store IN $storess
        ORDER BY o.id DESC
        LIMIT $Limit,10 ) AS inventory
        GROUP BY inventory.EmployeeID
登录后复制

可以使用以下 Laravel Query Builder 代码等效地实现它:

百度智能云·曦灵
百度智能云·曦灵

百度旗下的AI数字人平台

百度智能云·曦灵 83
查看详情 百度智能云·曦灵
use Illuminate\Support\Facades\DB;

$stores = ['store1', 'store2', 'store3']; // 示例 store 数组
$limit = 0; // 示例 limit 值

$result = DB::table(DB::raw("( SELECT i.id AS ItemID,
        o.id AS OrderID,
        o.EmployeeID,
        o.created_date,
        (o.Quantity * i.price) AS calculation
        FROM `stationary_orders` AS o
        LEFT JOIN `stationary_items` AS i ON o.Stationary_ID = i.id
        WHERE o.Store IN ('" . implode("','", $stores) . "')
        ORDER BY o.id DESC
        LIMIT " . $limit . ",10 ) AS inventory"))
    ->select([
        'inventory.EmployeeID',
        DB::raw('inventory.created_date AS OrderDate'),
        DB::raw('SUM(inventory.calculation) AS TotalPrice')
    ])
    ->groupBy('inventory.EmployeeID')
    ->get();
登录后复制

或者使用 fromSub 方法:

use Illuminate\Support\Facades\DB;

$stores = ['store1', 'store2', 'store3']; // 示例 store 数组
$limit = 0; // 示例 limit 值

$result = DB::table(function ($query) use ($stores, $limit) {
    $query->select([
        'i.id AS ItemID',
        'o.id AS OrderID',
        'o.EmployeeID',
        'o.created_date',
        DB::raw('(o.Quantity * i.price) AS calculation')
    ])
    ->from('stationary_orders AS o')
    ->leftJoin('stationary_items AS i', 'o.Stationary_ID', '=', 'i.id')
    ->whereIn('o.Store', $stores)
    ->orderBy('o.id', 'DESC')
    ->limit(10)
    ->offset($limit);
}, 'inventory')
->select([
    'inventory.EmployeeID',
    DB::raw('inventory.created_date AS OrderDate'),
    DB::raw('SUM(inventory.calculation) AS TotalPrice')
])
->groupBy('inventory.EmployeeID')
->get();
登录后复制

代码解释:

  1. DB::table(function ($query) use ($stores, $limit) { ... }, 'inventory'): 这部分定义了主查询的 from 子句,并使用 fromSub 方法嵌入一个子查询。function ($query) use ($stores, $limit) 定义了子查询构建器。'inventory' 是子查询的别名。
  2. $query->select([...])->from('stationary_orders AS o')->...: 这是子查询的构建过程。它选择需要的列,连接 stationary_orders 和 stationary_items 表,并应用 WHERE 子句和排序。
  3. ->whereIn('o.Store', $stores): whereIn 方法用于构建 WHERE ... IN (...) 子句,其中 $stores 是一个包含多个商店 ID 的数组。
  4. ->orderBy('o.id', 'DESC')->limit(10)->offset($limit): 添加排序、限制和偏移量。
  5. ->select([...])->groupBy('inventory.EmployeeID')->get(): 这是主查询的构建过程。它选择需要的列,并使用 groupBy 方法对结果进行分组。

注意事项:

  • 确保正确转义 $stores 数组中的值,以防止 SQL 注入攻击。 在上面的例子中,使用 implode 方法并手动添加引号可能存在安全风险。建议使用 Laravel 的 Query Builder 的 whereIn 方法,它会自动处理转义。
  • fromSub 方法返回的是一个 Query Builder 实例,因此您可以继续链式调用其他 Query Builder 方法,例如 where、orderBy 和 groupBy。
  • 子查询的别名(在本例中为 'inventory')必须是唯一的,并且不能与主查询中的任何其他表名或别名冲突。
  • 在复杂的查询中,使用 fromSub 可以提高代码的可读性和可维护性。

总结

通过使用 Laravel 的 fromSub 方法,您可以轻松地将包含子查询的原始 SQL 查询转换为使用 Query Builder 的等效查询。这不仅可以提高代码的可读性和可维护性,还可以利用 Query Builder 提供的安全性和便利性。 始终注意 SQL 注入风险,并使用适当的转义机制或 Query Builder 的内置方法来确保安全。

以上就是将原始子查询转换为 Laravel Query Builder 查询的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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