Laravel Eloquent:日期区间内求和列结果错误,请求排查
问题诊断与修复方案
1. 核心逻辑错误:订单筛选条件不准确
你的查询条件check_in >= '$start' AND check_out <= '$end'仅会统计完全落在指定日期区间内的订单,但实际收入报表需要统计的是所有与指定区间有交集的订单(比如订单入住早于区间开始但退房在区间内、入住在区间内但退房晚于区间结束,甚至订单完全覆盖整个区间),这些订单的收入都应该被纳入统计。
正确的区间重叠判断条件应为:
check_out >= '$start' AND check_in <= '$end'
这个条件的逻辑是:订单的退房时间不早于区间开始,且入住时间不晚于区间结束,能覆盖所有和目标区间有重叠的订单。
2. SQL注入风险与代码优化
你直接在whereRaw中拼接变量$start和$end存在SQL注入风险,同时可能因日期格式不匹配导致查询异常,应使用Laravel的参数绑定机制规避问题。
此外,两次独立查询可以合并为一次,减少数据库请求次数,提升执行效率。
修复后的代码
// 合并查询,一次性获取deposit和balance的总和 $totals = Booking::whereRaw('check_out >= ?', [$start]) ->whereRaw('check_in <= ?', [$end]) ->selectRaw('SUM(deposit) as total_deposit, SUM(balance) as total_balance') ->first(); $deposit = $totals->total_deposit ?? 0; $balance = $totals->total_balance ?? 0; $revenue = $deposit + $balance;
额外验证建议
- 确认
$start和$end的日期格式与数据库中check_in、check_out的格式一致(如统一为YYYY-MM-DD),格式不匹配会导致筛选结果偏差。 - 可手动在数据库中执行对应SQL语句,对比结果是否符合预期,验证逻辑正确性。
内容的提问来源于stack exchange,提问作者Benjamin Mwendwa Munyoki
相关产品推荐
相关产品推荐

