在Laravel中使用Eloquent查询时如何给日期字段值添加天数?
正确实现方式
你需要的逻辑等价于「创建时间在今天倒推4天到今天的日期区间内」,有两种常用的实现方案:
方案1:优先推荐(性能更高、兼容性更好)
这种写法不对数据库字段做运算,可以命中created_at字段的索引,同时用Laravel封装的whereDate方法自动适配不同数据库的日期语法:
Post::whereDate('created_at', '<=', today()) ->whereDate('created_at', '>=', today()->subDays(4)) ->get();
如果你的需求需要精确到时分秒而非按自然日比较,将whereDate替换为where,today()替换为now()即可。
方案2:原生SQL写法(适合需要自定义复杂日期逻辑的场景)
如果你需要直接对字段做日期加法运算,可以用whereRaw方法传入原生表达式,MySQL环境下写法如下:
Post::whereRaw('DATE(created_at) <= ?', [today()]) ->whereRaw('DATE(created_at) + INTERVAL 4 DAY >= ?', [today()]) ->get();
原有代码问题说明
你之前写的where('created_at + 7 days', now()->toDateTimeString())语法不生效,是因为Eloquent的where方法默认将第一个参数识别为纯字段名,不会解析内部的运算表达式,会直接将created_at + 7 days当做字段名查询,因此无法得到预期结果。
内容的提问来源于stack exchange,提问作者schutte
相关产品推荐
相关产品推荐

