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

