Laravel Eloquent join子查询where列名比对报unknown column错误求助
错误原因
- 你写的
App\Elrd::where("state_code",'=',DB::raw(policy_periods.statecode))->where('date',"<=",$mod_rating_eff_date)->max('date')会在主查询构造阶段就单独执行,此时主查询的policy_periods表还未加载到查询上下文,因此会抛出字段不存在的错误。 - join闭包内的条件如果需要关联主表字段做子查询,不能提前触发查询执行,必须将子查询作为SQL片段和主查询一起解析。
解决方案
方案1:使用whereRaw手写子查询(兼容性最好)
直接将取最大日期的逻辑写成子查询片段,通过预编译绑定传入参数,修改后的leftjoin部分代码如下:
->leftjoin('elrds', function($join) use($mod_rating_eff_date) { $join->on('elrds.state_code', '=', 'policy_periods.statecode'); $join->on('elrds.class_code', '=', 'payrolls.code'); $join->whereRaw('elrds.date = (SELECT MAX(`date`) FROM `elrds` WHERE `state_code` = `policy_periods`.`statecode` AND `date` <= ?)', [$mod_rating_eff_date]); })
方案2:使用查询构造器闭包子查询(不用手写SQL)
如果不想写原生SQL,可以用Laravel查询构造器的闭包子查询功能,自动生成子查询片段:
->leftjoin('elrds', function($join) use($mod_rating_eff_date) { $join->on('elrds.state_code', '=', 'policy_periods.statecode'); $join->on('elrds.class_code', '=', 'payrolls.code'); $join->where('elrds.date', function ($subQuery) use ($mod_rating_eff_date) { $subQuery->from('elrds') ->selectRaw('MAX(`date`)') ->whereColumn('state_code', 'policy_periods.statecode') ->where('date', '<=', $mod_rating_eff_date); }); })
两种方案逻辑和原始需求完全一致,同时规避了SQL注入风险。
内容的提问来源于stack exchange,提问作者Code Embassy
相关产品推荐
相关产品推荐

