如何用Laravel查询构造器改写指定原生SQL语句?
修正Laravel查询构造器写法解决聚合查询报错问题
你的原生SQL逻辑是对的,但尝试的查询构造器写法踩了个常见坑:min()/max()这类聚合方法是用来直接返回单个聚合结果的,不能直接链式调用用来定义select字段的别名,这就是导致语法报错的原因。
给你两种和原生SQL逻辑完全一致的正确写法:
写法一:用selectRaw简化聚合字段定义
这是最简洁的方式,直接把原生的聚合字段语句放到selectRaw里:
DB::table('trainings') ->join('trainingsdatas', 'trainings.id', '=', 'trainingsdatas.training_id') ->where('trainings.user_id', $id) ->selectRaw('min(heartrate) as hr, max(rotation) as rot, max(calories) as cal') ->first();
这里我把主表换成了trainings(和你原生SQL的表顺序一致,逻辑更清晰),最后用first()代替get(),因为这个查询只会返回一行结果,first()更贴合需求。
写法二:用select结合DB::raw逐个定义字段
如果需要更灵活地控制每个字段,可以拆分到select方法里:
DB::table('trainings') ->join('trainingsdatas', 'trainings.id', '=', 'trainingsdatas.training_id') ->where('trainings.user_id', $id) ->select( DB::raw('min(heartrate) as hr'), DB::raw('max(rotation) as rot'), DB::raw('max(calories) as cal') ) ->first();
简单说下你原来写法的问题:当你调用->min('heartrate as hr')时,Laravel会直接执行一个查询来获取heartrate的最小值,而不是把这个字段加入到当前的查询构造中,后续的max()、where()方法自然就会因为上下文错误而报错啦。
内容的提问来源于stack exchange,提问作者vergil_3
相关产品推荐
相关产品推荐

