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

如何在Laravel中通过单条SQL查询获取两个聚合结果

Laravel单查询实现双聚合结果

当然可以通过单条查询实现,利用SQL的条件聚合函数就能在一次查询中同时计算出当月积分和总积分。

直接上实现代码:

$user = Auth::guard('api')->user();
$stats = UserScore::where('user_id', $user->id)
    ->selectRaw('
        SUM(score) as total_score,
        SUM(CASE WHEN MONTH(created_at) = ? THEN score ELSE 0 END) as current_month_score
    ', [now()->month])
    ->first();

$data = [
    'total_score' => $stats->total_score ?? 0,
    'current_month_score' => $stats->current_month_score ?? 0
];

代码说明:

  • 用selectRaw编写SQL聚合逻辑,通过CASE WHEN判断记录的created_at月份是否等于当前月份,满足条件则累加score,否则加0,以此得到当月积分总和;同时直接用SUM(score)计算总积分。
  • 绑定now()->month作为参数,避免SQL注入风险。
  • 用first()执行查询并返回包含两个聚合结果的模型实例,最后将结果赋值到$data数组,?? 0用来处理无数据时返回null的情况,保证数值类型统一。

补充提示:

如果你的created_at字段存储的是UTC时间,要注意时区差异问题,可以根据用户设置的时区转换当前月份,比如:

$currentMonth = now()->timezone($user->timezone)->month;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:17:11