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

Laravel如何使用Eloquent计算列值总和及解决相关报错

问题根因

你写的Eloquent聚合查询语法本身没有问题,触发Call to a member function first() on string报错的核心原因是框架原生的sum()聚合方法被覆盖了,常见触发场景:

  • Invoice模型内定义了和sum重名的自定义方法、属性访问器或本地作用域,调用时框架优先执行了你自定义的逻辑,返回值是字符串类型,后续链式调用first()方法时就会抛出错误。
  • 模型挂载的全局作用域逻辑有误,没有返回查询构造器实例而是直接返回了字符串,打断了查询链式调用流程。

注:你给出的样例数据中,状态为Completed的发票金额合计为300.00+500.00=800.00,和你预期的900.00存在差值,可自行核对全量数据或过滤条件是否完整。

修复方案

1. 排查重名冲突

打开app/Models/Invoice.php文件,查找是否存在和sum重名的定义,将自定义方法重命名为不冲突的名称即可:

// 重命名/移除这类和聚合方法重名的定义
public function sum()
{
    // 自定义逻辑
}

// 重名的访问器
public function getSumAttribute()
{
    // 自定义逻辑
}

// 重名的本地作用域
public function scopeSum()
{
    // 自定义逻辑
}

重名问题解决后,你原来写的查询代码就可以正常运行。

2. 临时绕过方案

如果暂时定位不到重名点,可以直接调用查询构造器绕过Eloquent模型,不会触发模型内的自定义逻辑:

$total = \DB::table('invoices')
    ->where('status', 'Completed')
    ->sum('amount');

3. 视图适配

查询到的合计值如果需要固定保留两位小数展示,可以在控制器中格式化后再传给视图:

// 控制器传参逻辑
return view('对应视图路径', [
    'totalAmount' => number_format($total, 2, '.', '')
]);

Blade视图中直接输出变量即可:

<table class="s-table">
<thead>
<tr>
<th style="text-align: center;">业务项</th>
<th style="text-align: center;">数量</th>
<th style="text-align: right;">总金额</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">发票</td>
<td style="text-align: center;">6</td>
<td style="text-align: right;"><strong>{{ $totalAmount }}</strong></td>
</tr>
</tbody>
</table>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:54:21