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

Laravel中如何用Case/Eloquent获取查询值并遍历月份字段

修正Laravel Query Builder的CASE聚合查询及字段访问问题

问题原因

你遇到的字段名显示完整CASE语句而非别名的问题,是因为Laravel Query Builder默认会将select中的字符串视为字段标识符,而非原生SQL表达式。如果不明确声明原生SQL部分,框架无法解析别名设置。

正确的Query Builder写法

假设你原本可正常运行的SQL如下:

SELECT c.nome,
       SUM(CASE WHEN MONTH(m.data) = 1 THEN m.valor ELSE 0 END) AS jan,
       SUM(CASE WHEN MONTH(m.data) = 2 THEN m.valor ELSE 0 END) AS fev,
       SUM(CASE WHEN MONTH(m.data) = 3 THEN m.valor ELSE 0 END) AS mar
FROM movimentos m
JOIN categorias c ON m.categoria_id = c.id
GROUP BY c.nome;

对应的Laravel Query Builder需要用DB::raw()包裹每个CASE聚合表达式,确保框架正确解析原生SQL及别名:

use Illuminate\Support\Facades\DB;

$results = DB::table('movimentos as m')
    ->join('categorias as c', 'm.categoria_id', '=', 'c.id')
    ->select([
        'c.nome',
        DB::raw('SUM(CASE WHEN MONTH(m.data) = 1 THEN m.valor ELSE 0 END) AS jan'),
        DB::raw('SUM(CASE WHEN MONTH(m.data) = 2 THEN m.valor ELSE 0 END) AS fev'),
        DB::raw('SUM(CASE WHEN MONTH(m.data) = 3 THEN m.valor ELSE 0 END) AS mar')
    ])
    ->groupBy('c.nome')
    ->get();

调试验证

可以通过toSql()方法查看生成的SQL,确认是否与原SQL一致:

echo $results->toSql();

foreach循环中正确获取字段值

查询返回的是Eloquent集合(包含StdClass对象),直接通过对象属性访问别名字段即可:

foreach ($results as $item) {
    echo "分类名称:{$item->nome}\n";
    echo "1月统计值:{$item->jan}\n";
    echo "2月统计值:{$item->fev}\n";
    echo "3月统计值:{$item->mar}\n";
}

如果需要以数组形式处理,可先将集合转为数组,再通过数组索引访问:

$resultsArray = $results->toArray();
foreach ($resultsArray as $item) {
    echo "分类名称:{$item['nome']}\n";
    echo "1月统计值:{$item['jan']}\n";
}

内容的提问来源于stack exchange,提问作者Incrivel Monstro Verde

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:35:38