Laravel Query Builder实现按日期分组并分别求和债务与还款
解决方案
核心思路
通过条件聚合函数按日期分组,分别计算债务(amount为负的总和)和还款(amount为正的总和),保证结果按日期维度聚合。
Eloquent 实现代码
假设MoneyHistory模型用created_at字段作为日期分组依据,代码如下:
$result = MoneyHistory::selectRaw( 'DATE(created_at) as date, SUM(CASE WHEN amount < 0 THEN amount ELSE 0 END) AS total_debt, SUM(CASE WHEN amount > 0 THEN amount ELSE 0 END) AS total_repayment' ) ->groupBy('date') ->orderBy('date') ->get(); // 输出目标JSON格式 return $result->toJson(JSON_PRETTY_PRINT);
关键说明
DATE(created_at) as date:将时间戳转换为纯日期格式,确保按天分组(如果表中有单独的date字段,直接替换即可)。- 债务求和:仅对
amount为负数的记录求和,保留负数形式(若需要正数结果,可嵌套ABS()函数)。 - 还款求和:仅对
amount为正数的记录求和,直接得到总还款额。 groupBy('date'):按日期维度聚合数据,确保每个日期只返回一条汇总记录。
精准区分场景(可选)
如果需要严格通过repayment_id是否为空来区分债务/还款场景(债务场景repayment_id为空,还款场景不为空),可调整聚合条件:
$result = MoneyHistory::selectRaw( 'DATE(created_at) as date, SUM(CASE WHEN repayment_id IS NULL THEN amount ELSE 0 END) AS total_debt, SUM(CASE WHEN repayment_id IS NOT NULL THEN amount ELSE 0 END) AS total_repayment' ) ->groupBy('date') ->orderBy('date') ->get();
以上代码执行后,会输出每个日期对应的债务总额、还款总额,结构完全匹配你期望的JSON格式。
内容的提问来源于stack exchange,提问作者Madamin
相关产品推荐
相关产品推荐

