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

Laravel如何查询end_at为空或大于等于今日日期的记录

问题说明

表结构示例
当前业务表中start_at、end_at字段均为可空类型,查询需求是排除所有end_at日期早于当日的记录,最终返回两类数据:

  • end_at非空,且值大于等于当日日期的记录
  • end_at字段值为NULL的记录

你当前写的代码只能匹配到end_at >= 当日日期的记录,会把所有end_at为NULL的记录全部漏掉——因为SQL语法中NULL和任何值做>=/=/<这类比较运算时,返回结果都不为真,所以NULL值的记录不会被这个条件命中。

实现代码

Laravel Eloquent直接提供了orWhereNull方法用来匹配字段为NULL的记录,直接把两个条件用OR拼接即可满足需求:

$date = today()->format('Y-m-d');
$informations = Information::where('end_at', '>=', $date)
    ->orWhereNull('end_at')
    ->get();

如果你的查询还需要追加其他过滤条件,建议用闭包把这两个关于end_at的条件包起来,避免OR逻辑和其他条件拼接时出现优先级错误:

$date = today()->format('Y-m-d');
$informations = Information::where(function ($query) use ($date) {
    $query->where('end_at', '>=', $date)
        ->orWhereNull('end_at');
})
// 其他查询条件写在这里即可,不会受上面OR逻辑的影响
->get();
逻辑说明

上面的代码最终生成的WHERE条件等价于原生SQL:

WHERE (end_at >= '对应日期字符串' OR end_at IS NULL)

刚好能覆盖你要的两类数据,把end_at早于当日的记录全部排除。

内容的提问来源于stack exchange,提问作者psudo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 21:24:30