如何使用Laravel Eloquent查询不在指定日期数组内的数据库记录
解决方案
首先你需要根据业务明确「日期不在数组内」的定义,以下是两种最常见场景的实现代码:
场景1:仅排除start_date或end_date的年月日属于排除数组的记录
适合需求为「记录的开始/结束日期本身不在排除列表中」的场景,不会校验两个日期中间覆盖的时间段:
// 你的排除日期数组 $excludeDates = [ "2021-12-06", "2021-12-07", "2021-12-08", "2021-12-09", "2021-12-10" ]; // ClinicSchedule替换为你实际的Eloquent模型名 $result = ClinicSchedule::whereNotIn(\DB::raw('DATE(start_date)'), $excludeDates) ->whereNotIn(\DB::raw('DATE(end_date)'), $excludeDates) ->get();
场景2:排除时间区间[start_date, end_date]覆盖了任意一个排除日期的记录
适合需求为「记录的整个生效周期完全不涉及排除列表里的任何日期」的场景,比如某条记录开始时间是2021-12-05、结束时间是2021-12-11,哪怕起止日期都不在排除数组里,也会因为覆盖了排除日期被过滤:
$excludeDates = [ "2021-12-06", "2021-12-07", "2021-12-08", "2021-12-09", "2021-12-10" ]; $result = ClinicSchedule::where(function ($query) use ($excludeDates) { foreach ($excludeDates as $date) { $query->where(function ($subQuery) use ($date) { // 校验当前排除日期不在记录的时间区间内 $subQuery->whereDate('start_date', '>', $date) ->orWhereDate('end_date', '<', $date); }); } })->get();
注意事项
- 若你只需要校验
start_date是否在排除数组中,删除场景1中对应end_date的过滤条件即可 - 若未全局引入DB门面,可在文件顶部添加
use Illuminate\Support\Facades\DB;后去掉代码中DB前的反斜杠
内容的提问来源于stack exchange,提问作者esraa zezo
相关产品推荐
相关产品推荐

