Laravel Eloquent如何基于表中时间和分钟字段筛选任务记录?
解决方案
你的问题出在PHP端无法直接使用数据库字段动态计算时间——原来的代码里,Carbon::now()->addMinutes(DB::raw('minutes'))是在PHP本地执行的,DB::raw('minutes')在这里只是个字符串,根本没法关联到数据库里每条记录的minutes字段值,所以动态计算不生效,硬编码固定值才能正常工作。
完全可以用Eloquent直接在数据库层面完成筛选,不需要查全表再循环校验,核心是把时间计算逻辑放到数据库查询语句里:
针对MySQL的实现
如果你的数据库是MySQL,可以利用TIME_SUB函数计算任务的提醒触发时间(截止时间减去提前分钟数),再和当前时间对比:
$tasks = Task::whereRaw("TIME_SUB(time, INTERVAL minutes MINUTE) <= TIME(NOW()) AND time > TIME(NOW())")->get();
代码说明
TIME_SUB(time, INTERVAL minutes MINUTE):把每条记录的time字段(比如03:00)减去对应的minutes分钟,得到提醒触发时间(比如02:30)TIME(NOW()):获取数据库服务器当前的时分时间(和你的time字段格式匹配)- 条件
<= TIME(NOW())确保当前时间已经达到或超过提醒触发时间,time > TIME(NOW())避免筛选出已经过了截止时间的任务(防止重复触发通知)
兼容其他数据库的写法
如果用的是其他数据库(比如PostgreSQL),只需要替换对应的时间函数即可,核心逻辑不变:
// PostgreSQL示例 $tasks = Task::whereRaw("time - INTERVAL '1 minute' * minutes <= CURRENT_TIME AND time > CURRENT_TIME")->get();
内容的提问来源于stack exchange,提问作者Hardist
相关产品推荐
相关产品推荐

