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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:17:44