首页 > 解决方案 > 我们如何在 laravel eloquent/querybuilder 中转换 sql

问题描述

基本上我需要根据 cityId 和 postCode 在需要提供一些详细信息的地方显示报告。

因此,如果 cityId 为 NULL 并且 postCode 为 NULL 那么这些记录的计数应该在 data1 之下。

同样, - 当 cityId 在 (123, 456) THEN 这些记录的计数应该在'data2' - 当 cityId 在 (789, 999) THEN 'data3' - 当 cityId 在 (111, 222) THEN 'data4' - ELSE '数据5'

我在这里有 2 个查询:

  1. 将此 sql 转换为 laravel eloquent/querybuilder 方式。
  2. 提到的最后一个条件

计数(当 cityId 不为 NULL 且 cityId 不在(123、456、789、999、111、222)然后 1 ELSE NULL END 时的情况)作为来自客户的“data5”)

必须是上述所有条件的 else 部分。

我已经尝试过了,但无法达到预期的结果

$result = Customer::select(Customer::raw("SELECT
    COUNT(CASE WHEN cityId IS NULL AND postCode IS NULL then 1 ELSE NULL END) as \"data1\",
    COUNT(CASE WHEN cityId IN (123, 456) then 1 ELSE NULL END) as \"data2\",
    COUNT(CASE WHEN cityId IN (789,999) then 1 ELSE NULL END) as \"data3\",
    COUNT(CASE WHEN cityId IN (111, 222) then 1 ELSE NULL END) as \"data4\",
    COUNT(CASE WHEN cityId IS NOT NULL AND cityId NOT IN (123, 456, 789, 999, 111, 222) then 1 ELSE NULL END ) as \"data5\"
from trial
        "))->get();

期望的结果:data1:7 data2:5 data3:12 data4:10 data5:1

标签: laravelpostgresqleloquentlaravel-query-builder

解决方案


暂时,我为上面提到的问题找到了一个替代解决方案,它以某种方式解决了我的第一个问题。

仍在寻找第二个问题。

DB::table('customers')
        ->select(
            DB::raw('COUNT(CASE WHEN cityId IS NULL AND postCode IS NULL then 1 ELSE NULL END) as "data1",
                    COUNT(CASE WHEN cityId IN (123, 456) then 1 ELSE NULL END) as "data2",
                    COUNT(CASE WHEN cityId IN (789,999) then 1 ELSE NULL END) as "data3",
                    COUNT(CASE WHEN cityId IN (4965,4959) then 1 ELSE NULL END) as "data4",
                    COUNT(CASE WHEN cityId IS NOT NULL AND cityId NOT IN (123, 456, 789, 999, 111, 222) then 1 ELSE NULl END ) as "data5"')
        )->get();

推荐阅读