如何在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
相关产品推荐
相关产品推荐

