【问题标题】:Laravel group by issues with an inline select statementLaravel group by 内联选择语句的问题
【发布时间】:2019-12-22 16:56:29
【问题描述】:

下面的 SQL 工作正常。它正在采用这个并在问题所在的 Laravel 中实现它。 sqlfiddle 可以在here 找到。

SELECT provider_id
     , o.shortName
     , count(b.site_id) as sites
     , ( select b.depositFee 
              + ( select sum(depositFee) 
                    from backhaul 
                   where backhaul.parent_id=b.id
                ) 
       ) as entranceFee
     , ( select b.rightOfWayCharges 
              + ( select sum(rightOfWayCharges) 
                    from backhaul 
                   where backhaul.parent_id = b.id
                )
       ) as rowFee
    FROM backhaul AS b
    JOIN organisation AS o  
      ON (b.provider_id = o.id)
   WHERE isnull(b.parent_id)
   GROUP 
      BY provider_id
       , entranceFee
       , rowFee

表格是递归的。这给了我以下结果:

--------------------------------------------------------
provider_id | sshortName | sites | entranceFee | rowFee
--------------------------------------------------------
802 | TM | 1 | 12500.00 | 7500.00  
803 | TIME | 1 | 7500.00 | 0.00

问题是 Laravel 似乎无法识别 group by 语句中的“entranceFee”或“rowFee”列。

我的 Lararvel 5.7 实现如下所示:

$sql = DB::raw("provider_id, o.shortName, count(b.site_id) as sites," .
"(select b.depositFee + (select sum(depositFee) from backhaul where backhaul.parent_id=b.id)) as entranceFee," .
"(select b.rightOfWayCharges + (select sum(rightOfWayCharges) from backhaul where backhaul.parent_id=b.id)) as rowFee") ;

$data = DB::table("backhaul as b")->select($sql)
   ->join("organisation as o", "b.provider_id", "=", "o.id")
   ->whereNull("b.parent_id")
   ->groupBy("b.provider_id", DB::raw("entranceFee"), DB::raw("rowFee"))
   ->paginate() ;

由于 GROUP BY 语句中缺少 SELECT #4 的错误,我得到了通常的 MySQL 组。

我已尝试将 groupBy(["provider_id", DB::raw("entranceFee"), DB::raw("rowFee")]) 添加为数组,但仍然失败。如果我也添加内联 SQL 选择,它会出错。

【问题讨论】:

    标签: php mysql laravel laravel-5 eloquent


    【解决方案1】:

    Tray2 在Laracasts 上回答了这个问题:

    确认以下解决方案有效:

    $data = DB::select('SELECT provider_id
         , o.shortName
         , count(b.site_id) as sites
         , ( select b.depositFee 
                  + ( select sum(depositFee) 
                        from backhaul 
                       where backhaul.parent_id=b.id
                    ) 
           ) as entranceFee
         , ( select b.rightOfWayCharges 
                  + ( select sum(rightOfWayCharges) 
                        from backhaul 
                       where backhaul.parent_id = b.id
                    )
           ) as rowFee
        FROM backhaul AS b
        JOIN organisation AS o  
          ON (b.provider_id = o.id)
       WHERE isnull(b.parent_id)
       GROUP 
          BY provider_id
           , entranceFee
           , rowFee');
    

    【讨论】:

      【解决方案2】:

      Laravel 很可能将它们包装在反引号中,这会导致 MySQL 相信它们是某个表中的实际列。也可以尝试将它们包装在 DB::raw 中。

      $data = DB::table("backhaul as b")->select($sql)
          ->join("organisation as o", "b.provider_id", "=", "o.id")
          ->whereNull("b.parent_id")
          ->groupBy([
              "b.provider_id",
              \DB::raw('entranceFee'),
              \DB::raw('rowFee'),
          ])
          ->paginate() ;
      

      【讨论】:

      • 感谢 user1669496,我试过了。但是,我现在得到:Unknown column 'entranceFee' in 'group statement'。从输出中,DB::raw 确实删除了反引号。
      • 我尝试将整个子选择 SQL 放入 group by (在其他情况下我不得不这样做)但是因为 SUM() MySQL 中的 SUM() 操作正确发疯了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多