Laravel中如何用where结合自定义函数比较今日与创建日20工作日后日期
Laravel where查询中使用自定义日期函数的问题
不能直接像你示例里那样在where方法中调用自定义PHP函数afterTwentyBusinessDays($created_at),原因很简单:where方法会把条件转换成SQL语句在数据库端执行,而数据库无法识别你定义的PHP函数。
给你两种可行的解决方案:
方案一:将函数逻辑转为SQL表达式,使用whereRaw
把afterTwentyBusinessDays的日期计算逻辑转换成数据库能识别的SQL语句,通过whereRaw执行原生查询。
比如如果你的函数只是排除周末计算20个工作日,对应的SQL逻辑可以这样写:
->whereRaw('DATE_ADD(created_at, INTERVAL (20 + FLOOR((20 - 1)/5)*2) DAY) >= CURDATE()')
如果需要排除节假日,你需要先在数据库中创建节假日表,然后通过关联查询或子查询来调整日期计算逻辑,确保SQL能准确算出20个工作日后的日期。
方案二:应用层过滤(数据量小时适用)
如果数据量不大,可以先查询出所有记录,再用Laravel集合的filter方法在应用层过滤:
$targetRecords = YourModel::get()->filter(function ($model) { return afterTwentyBusinessDays($model->created_at) >= today(); });
这种方法不用修改SQL,但数据量大时会占用较多内存,性能较差,只适合小数据集场景。
内容的提问来源于stack exchange,提问作者wertyu
相关产品推荐
相关产品推荐

