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

Laravel Eloquent转换含BETWEEN关联的SQL语句问题求助

解决Laravel Eloquent LEFT JOIN带BETWEEN条件的问题

方案1:用whereRaw替代on实现复杂Join条件

on方法更适合字段相等的匹配逻辑,对于BETWEEN这类复杂条件,改用whereRaw能正确绑定参数并生成预期SQL:

->leftJoin('event_override_hours', function($join) use ($timestamp) {
    $join->on('event_normal_hours.event_id', '=', 'event_override_hours.event_id')
         ->whereRaw('? BETWEEN event_override_hours.start_date AND event_override_hours.end_date', [$timestamp]);
})

方案2:拆分BETWEEN为两个比较条件

如果不想使用原生SQL片段,可以把BETWEEN拆分为<=和>=两个单独条件,完全通过Eloquent方法实现:

->leftJoin('event_override_hours', function($join) use ($timestamp) {
    $join->on('event_normal_hours.event_id', '=', 'event_override_hours.event_id')
         ->where('event_override_hours.start_date', '<=', $timestamp)
         ->where('event_override_hours.end_date', '>=', $timestamp);
})

方案3:完整原生Join条件写法

如果需要一次性定义全部Join条件,可以直接将完整逻辑写入DB::raw,同时做好参数绑定避免注入:

->leftJoin('event_override_hours', function($join) use ($timestamp) {
    $join->on(DB::raw('event_normal_hours.event_id = event_override_hours.event_id AND ? BETWEEN event_override_hours.start_date AND event_override_hours.end_date'), [$timestamp]);
})

说明

  • 方案1兼顾安全性与可读性,是最推荐的实现方式
  • 方案2完全基于Eloquent语法,无需编写原生SQL片段
  • 方案3适合需要统一定义Join条件的场景,注意保证原生SQL的正确性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:42:03