如何在 Laravel 6 中转换原始 sql 查询?

Posted

技术标签:

【中文标题】如何在 Laravel 6 中转换原始 sql 查询?【英文标题】:How to convert a raw sql query in Laravel 6? 【发布时间】:2021-01-16 03:19:12 【问题描述】:

我有一个在 Heidi SQL 中运行良好的查询。现在我需要在 Laravel 中编写相同的查询。但它并没有返回我在 Heidi SQL 中得到的确切结果。有人在这里帮我更新我的查询。提前致谢。

查询:

SELECT
    x.*,
    IFNULL(y.status_count, 0) 
FROM
    status x
LEFT JOIN (
    SELECT
        order_status,
        COUNT(id) AS status_count 
    FROM
        order_header
    WHERE
        user_id = 1
    GROUP BY
        order_status
) AS y
    ON x.code = y.order_status
WHERE
    x.type = 'ORD'

我在 Laravel 中写的:

$orderStatistics = OrderHeader::select(
        'status.id',
        'status.name',
        'status.description',
        'status.type',
        'status.code',                                                    
        DB::raw('order_status,count(*) as status_count'),
        DB::raw('IFNULL(`order_header`.`order_status`, 0)')
    )
    ->leftjoin('status', 'status.code', '=', 'order_header.order_status')
    ->orderBy('status.id')
    ->groupBy('order_status')
    ->where([
        ['order_header.user_id', $userID],
        ['status.type', 'ORD']
    ])
    ->get();

$userID 是单独分配的。我需要返回的是,如果在 order_header 表中没有为给定用户 ID 找到任何 order_status 以显示 order_status 计为 0。

目前,我获取给定用户 ID 的状态,我需要显示状态表中的所有状态,并且计数为 0。

【问题讨论】:

【参考方案1】:

这是完全相同的查询。我自己没有测试过,但这是文档中显示的语法。

$y = DB::table('order_header')
    ->select('order_status')
    ->selectRaw('COUNT(id) AS status_count')
    ->where('user_id', 1)
    ->groupBy('order_status');

$query = DB::table('status', 'x')
    ->select('x.*')
    ->selectRaw('IFNULL(y.status_count, 0) AS status_count')
    ->leftJoinSub($y, 'y', function ($join) 
        $join->on('x.code', 'y.order_status');
    )
    ->where('x.type', 'ORD')
    ->get();

【讨论】:

以上是关于如何在 Laravel 6 中转换原始 sql 查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 7 中使用原始 SQL 查询创建范围?

如何在原始 sql WHERE IN [LUMEN/LARAVEL] 中绑定命名参数

如何使用 Laravel 的流畅查询构建器混合原始 SQL 和非原始 SQL

在 Laravel 4 中转义原始 SQL 查询

Laravel 查询构建器 - 如何按别名分组,或进行原始 groupBy

Laravel 5 Eloquent:如何获取正在执行的原始 sql? (带有绑定数据)