【问题标题】:Converting query into Laravel Query Builder with Count, filter, and WhereIn使用 Count、filter 和 WhereIn 将查询转换为 Laravel Query Builder
【发布时间】:2018-09-13 05:50:00
【问题描述】:

我有一个查询,我尝试将其转换为 laravel 查询生成器样式。 但是我没能成功。

这是我的查询

SELECT
  count(*)
    FILTER (WHERE order_status_id IN (5, 4, 15))        AS ready_for_delivery,
  count(*)
    FILTER (WHERE order_status_id IN (6))               AS out_for_delivery,
  count(*)
    FILTER (WHERE order_status_id IN (4, 10, 9, 12, 7)) AS completed_order,
  count(*)
    FILTER (WHERE order_status_id IN (11, 16, 17, 13))  AS waiting_for_cancellation_return_change
FROM order_item_histories;

这是我从http://www.midnightcowboycoder.com/ 得到的,这显然行不通。但这是一个起点

DB::table('order_item_histories')
        ->selectSub('count', 'ready_for_delivery')
        ->selectSub('FILTER', 'ready_for_delivery')
        ->selectSub('count', 'out_for_delivery')
        ->selectSub('FILTER', 'out_for_delivery')
        ->selectSub('count', 'completed_order')
        ->selectSub('FILTER', 'completed_order')
        ->selectSub('count', 'waiting_for_cancellation_return_change')
        ->selectSub('FILTER', 'waiting_for_cancellation_return_change')
        ->get();

这个查询有效,但它只是原始的。我知道没有伤害,但是..

        $aa = DB::table('order_item_histories')
            ->select(DB::raw('count(*)
    FILTER (WHERE order_status_id IN (5, 4, 15))        AS ready_for_delivery,
  count(*)
    FILTER (WHERE order_status_id IN (6))               AS out_for_delivery,
  count(*)
    FILTER (WHERE order_status_id IN (4, 10, 9, 12, 7)) AS completed_order,
  count(*)
    FILTER (WHERE order_status_id IN (11, 16, 17, 13))  AS waiting_for_cancellation_return_change'))
            ->get();

【问题讨论】:

  • 如果没坏,就不要修了
  • @Ohgodwhy 这是一种方法:)
  • 我认为像这样的多个调用会起作用->selectSub('count(*) FILTER (WHERE order_status_id IN (5, 4, 15))', 'ready_for_delivery'),但在这种情况下编写原始查询完全没问题,只是要小心 SQL 注入

标签: mysql laravel postgresql laravel-query-builder


【解决方案1】:
DB::table('order_item_histories')
    ->selectRaw('count(*) FILTER (WHERE order_status_id IN (?, ?, ?)) AS ready_for_delivery', [5, 4, 15])
    ->selectRaw('count(*) FILTER (WHERE order_status_id IN (?)) AS out_for_delivery', [6])
    ->selectRaw('count(*) FILTER (WHERE order_status_id IN (?, ?, ?, ?, ?)) AS completed_order', [4, 10, 9, 12, 7])
    ->selectRaw('count(*) FILTER (WHERE order_status_id IN (?, ?, ?, ?))  AS waiting_for_cancellation_return_change', [11, 16, 17, 13])
    ->get();

【讨论】:

    【解决方案2】:

    尝试使用case 而不是filter

    $users = DB::table('order_item_histories')
                     ->select(DB::raw('SUM(CASE WHEN order_status_id IN (5, 4, 15) THEN 1 ELSE 0 END) AS ready_for_delivery'))
                     ->select(DB::raw('SUM(CASE WHEN order_status_id IN (6) THEN 1 ELSE 0 END) AS out_for_delivery'))
                     ->select(DB::raw('SUM(CASE WHEN order_status_id IN (4, 10, 9, 12, 7) THEN 1 ELSE 0 END) AS completed_order'))
                     ->select(DB::raw('SUM(CASE WHEN order_status_id IN (11, 16, 17, 13) THEN 1 ELSE 0 END) AS waiting_for_cancellation_return_change'))
                     ->get();
    

    【讨论】:

    • 没有给我预期的输出。
    • 你得到了什么结果
    猜你喜欢
    • 2021-08-19
    • 2014-04-10
    • 2014-05-30
    • 2021-02-04
    • 2015-03-16
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多