You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 19:16:19