Laravel查询异常:需筛选未来6个月内数据却返回6个月后数据
问题排查与修正:筛选未来6个月内过期的药品
问题原因
你的查询逻辑完全与需求相悖:
- 需求是筛选未来6个月内过期的药品(即过期日期在当前时间到当前时间+6个月之间)
- 但当前代码使用
where('exp_date','>', Carbon::now()->addMonths(6)),实际是在筛选过期时间在6个月之后的药品,这直接导致返回结果不符合预期。 - 另外注意Carbon方法的规范命名:
addmonths应改为addMonths(PHP对方法名大小写不敏感,但遵循驼峰规范能避免潜在问题)
修正方案
根据业务需求,有两种常见的修正方式:
1. 仅筛选「未过期但将在未来6个月内过期」的药品
限定过期日期在当前时间到6个月后之间:
$medicines = Medicine::orderBy('exp_date', 'desc') ->where('exp_date', '<=', Carbon::now()->addMonths(6)) ->where('exp_date', '>=', Carbon::now()) ->paginate(15);
2. 筛选「已过期+未来6个月内过期」的药品(若业务需要统计这类范围)
只保留过期日期不晚于6个月后的条件:
$medicines = Medicine::orderBy('exp_date', 'desc') ->where('exp_date', '<=', Carbon::now()->addMonths(6)) ->paginate(15);
内容的提问来源于stack exchange,提问作者Shreeja Manandhar
相关产品推荐
相关产品推荐

