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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:48:05