Laravel日期时间比较问题:如何筛选晚于当前时间的API数据?
解决Laravel中筛选晚于当前时间的Datetime记录问题
嘿,我明白你的问题了——你想筛选出date_time字段晚于当前柏林时间的记录,但之前分开用whereDate和whereTime的写法逻辑有问题,导致时间筛选不符合预期。
问题出在哪?
你原来的代码:
$viewingAppointments = ViewingAppointment::whereDate('date_time', '>=', Carbon::now('Europe/Berlin')) ->whereTime('date_time', '>=', Carbon::now('Europe/Berlin')) ->withCount('requests') ->get();
这段代码的逻辑是日期大于等于今天,并且时间大于等于当前时间,这会错误排除掉那些日期在明天及以后,但时间早于当前时间的记录(比如当前是今天10点,明天9点的记录会被whereTime过滤掉,但实际上明天9点是晚于当前时间的),完全不符合你“只要整体时间晚于当前就输出”的需求。
正确的写法
你不需要分开日期和时间筛选,直接对整个date_time字段和当前时间做比较就可以了,Laravel支持直接用Carbon实例作为查询参数:
// 先获取当前柏林时间,避免多次调用重复生成时间 $currentBerlinTime = Carbon::now('Europe/Berlin'); $viewingAppointments = ViewingAppointment::where('date_time', '>=', $currentBerlinTime) ->withCount('requests') ->get();
这样数据库会直接把date_time字段的完整datetime值和$currentBerlinTime做比较,只要date_time整体晚于当前时间的记录都会被筛选出来,完美贴合你的需求。
额外说明
- 确保你的
date_time字段在数据库中是datetime或timestamp类型,这样数据库才能正确进行datetime比较。 - 如果你想用Carbon的比较器语法,也可以简化成下面的写法(效果和上面完全一致):
$viewingAppointments = ViewingAppointment::where('date_time', '>=', Carbon::now('Europe/Berlin')) ->withCount('requests') ->get();
Laravel会自动把Carbon实例转化为数据库能识别的datetime格式,不需要额外处理。
内容的提问来源于stack exchange,提问作者Lukas Niestrat
相关产品推荐
相关产品推荐

