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
相关产品推荐
相关产品推荐

