You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 22:12:29