Laravel中如何将指定SQL转为查询构建器?日期范围查询求助
Laravel中实现日期区间匹配查询的正确写法
我来帮你修正这个Laravel查询的写法~你之前的问题出在对whereBetween方法的理解上——Laravel的whereBetween是用来检查某个字段的值是否在给定的两个值之间,但你需要的是反过来:当前日期是否落在startPeriod和endPeriod这两个字段的区间内,所以直接用whereBetween是行不通的,下面给你两种靠谱的实现方式:
方法一:使用whereRaw直接映射原生SQL
这种方式最贴近你原本的SQL逻辑,同时通过参数绑定避免SQL注入风险:
$now = Carbon::now()->toDateTimeString(); $prod = DB::table('period') ->where('priceId', 1788749) ->whereRaw("? BETWEEN startPeriod AND endPeriod", [$now]) ->get();
这里的?会被后面数组里的$now安全替换,完全对应你写的原生SQL逻辑。
方法二:拆分两个where条件
把区间判断拆成两个独立的条件,可读性更强,而且Laravel可以直接接收Carbon对象,不用手动转成字符串:
$now = Carbon::now(); $prod = DB::table('period') ->where('priceId', 1788749) ->where('startPeriod', '<=', $now) ->where('endPeriod', '>=', $now) ->get();
为什么你的原写法不对?
你之前的wherebetween($now, ['startPeriod', 'endPeriod'])会生成这样的错误SQL:
where '2024-xx-xx xx:xx:xx' between 'startPeriod' and 'endPeriod'
这里Laravel把startPeriod和endPeriod当成了字符串值,而不是字段名,自然查不出正确结果啦。
内容的提问来源于stack exchange,提问作者story ks
相关产品推荐
相关产品推荐

