You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Eloquent ORM中结合sum()、where between与group by?报错解决

解决Laravel查询构建器中sum()导致的Call to a member function groupBy() on string错误

这个报错的核心原因很明确:sum()是Laravel查询构建器的终止方法——调用它之后,框架会立即执行SQL并返回计算后的聚合结果(通常是字符串或数字类型),而不是继续返回查询构建器实例。你原来的代码把sum()放在groupBy()之前,相当于在尝试对一个字符串(sum的返回值)调用groupBy()方法,这自然会抛出错误。

下面给你两种针对性的解决方案,根据你的实际需求选择:

方案1:按销售ID分组并获取每组的小计

如果你需要按app_sales_id分组,同时获取每组的sub_total总和,应该用selectRaw()来定义聚合字段,保持链式调用的顺序(先过滤、关联,再分组,最后获取结果):

use Illuminate\Support\Facades\DB; // 记得引入DB门面

public function print_report(Request $request) { 
    $from = "2018-04-03"; 
    $to = "2018-04-17"; 
    
    $data = AppSalesDetail::select(
            'app_sales_detail.app_sales_id',
            'app_sales.*',
            DB::raw('SUM(app_sales_detail.sub_total) as total_sub_total') // 定义聚合字段别名
        )
        ->leftJoin('app_sales', 'app_sales.app_sales_id', '=', 'app_sales_detail.app_sales_id')
        ->whereBetween('sale_date', [$from, $to])
        ->groupBy('app_sales_detail.app_sales_id', 'app_sales.app_sales_id') // Laravel严格模式下,需包含所有非聚合字段
        ->get(); 
}

注意:如果你的Laravel开启了严格模式(默认开启),groupBy必须包含select中所有非聚合的字段,否则会抛出SQL语法错误。上面的例子里因为关联了app_sales表,所以需要把app_sales.app_sales_id也加入groupBy(或者根据实际情况添加其他需要的字段)。

方案2:获取指定日期范围内的总销售金额

如果你不需要分组,只是想计算整个日期范围内的sub_total总和,只需要把sum()放到链式调用的最后,不需要groupBy()和get():

public function print_report(Request $request) { 
    $from = "2018-04-03"; 
    $to = "2018-04-17"; 
    
    $totalSales = AppSalesDetail::select('app_sales_detail.*','app_sales.*')
        ->leftJoin('app_sales', 'app_sales.app_sales_id', '=', 'app_sales_detail.app_sales_id')
        ->whereBetween('sale_date', [$from, $to])
        ->sum('app_sales_detail.sub_total'); 
    
    // $totalSales 就是计算后的总金额,直接使用即可
}

简单总结一下:Laravel的查询构建器中,像sum()、count()、avg()这类聚合方法都是终止方法,调用后会直接返回结果,不能再链式调用其他查询构建器方法(比如groupBy()、get())。必须把聚合操作放在链式调用的最后,或者用selectRaw()/select()来定义聚合字段,保持查询构建器的实例状态。

内容的提问来源于stack exchange,提问作者Alimin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:57:40