Laravel MySQL查询使用whereColumn时如何将点(.)转为普通字符串
问题描述
处理subid字段相关查询时,Laravel自动在传入参数的点(.)后添加单引号,导致点被识别为字符串拼接表达式,而非普通字符串内容。在编写控制器datavolumechart方法按周统计年度工程量总数据时,调用whereColumn方法匹配subid字段值为1.A.A.1的记录触发该问题。
原错误实现代码如下:
public function datavolumechart() { $volume = lokasipekerjaan::select( DB::raw("YEAR(tanggal) as year"), DB::raw("SUM(volume) as total_volume"), )->havingRaw('total_volume < 100000000', [1]) ->whereColumn('subid','1.A.A.1') ->orderBy(DB::raw("WEEK(tanggal)")) ->groupBy(DB::raw("WEEK(tanggal)")) ->pluck('total_volume','year'); return view('admin.home',compact('volume')); }
问题原因
触发问题的核心原因是方法使用错误:whereColumn方法的设计用途是比较两个数据库字段的值是否相等,当传入带.的字符串参数时,Laravel会默认将.解析为字段层级分隔符(对应数据库.表.字段的语法格式),自动为分段内容添加标识符引号,最终导致传入的字符串值被错误解析为字段拼接表达式,和.本身是否需要转义没有关系。
解决方案
- 替换为正确的查询方法:做字段与固定字符串值的等值匹配时,直接使用普通
where方法即可,Laravel会自动将传入的第二个参数作为绑定值处理,不会解析值内部的.符号,会完全按照普通字符串做匹配。将代码中的->whereColumn('subid','1.A.A.1')修改为->where('subid', '1.A.A.1')即可解决问题。 - 特殊场景可选方案:如果需要手写原始查询逻辑,也可以使用
whereRaw配合参数绑定实现相同效果,写法为->whereRaw('subid = ?', ['1.A.A.1']),参数绑定机制同样会避免传入值被错误解析。
修正后的完整可运行代码:
public function datavolumechart() { $volume = lokasipekerjaan::select( DB::raw("YEAR(tanggal) as year"), DB::raw("SUM(volume) as total_volume"), )->havingRaw('total_volume < 100000000', [1]) ->where('subid','1.A.A.1') ->orderBy(DB::raw("WEEK(tanggal)")) ->groupBy(DB::raw("WEEK(tanggal)")) ->pluck('total_volume','year'); return view('admin.home',compact('volume')); }
内容的提问来源于stack exchange,提问作者Muhammad Bayu Kurniawan
相关产品推荐
相关产品推荐

