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

Laravel 5.5使用Eloquent更新数据时出现SQL语法错误求助

解决Laravel 5.5 Eloquent更新时的SQL语法错误

这个错误的根源一眼就能揪出来——你的纬度(latitud)和经度(longitud)值用了逗号作为小数分隔符,但MySQL只认点号.作为小数分隔符,直接导致SQL语句被解析出错了。

看你执行的SQL语句:

update `centro` set `updated_at` = 2018-02-19 15:58:01, `latitud` = 43,1769888, `longitud` = -8,4700727 where `id` = 7

MySQL看到latitud = 43,1769888时,会把43当成latitud的赋值,然后把1769888当成下一个要更新的字段,但后面根本没有对应的字段名,直接跟了逗号,这就触发了语法错误。

两种简单的解决方法:

1. 控制器里直接转换分隔符

如果是从请求里获取的参数,在赋值给模型前把逗号替换成点号就行,转成浮点型会更严谨:

public function update(Request $request, $id)
{
    $centro = Centro::findOrFail($id);
    
    $centro->latitud = (float)str_replace(',', '.', $request->latitud);
    $centro->longitud = (float)str_replace(',', '.', $request->longitud);
    
    $centro->save();
    
    return redirect()->back()->with('success', 'Centro actualizado correctamente');
}

2. 用模型存取器自动处理(更优雅)

如果这个字段经常需要处理,直接在Centro模型里定义setter,以后不管从哪里赋值,模型都会自动帮你转换:

class Centro extends Model
{
    // ... 其他模型代码
    
    public function setLatitudAttribute($value)
    {
        $this->attributes['latitud'] = (float)str_replace(',', '.', $value);
    }
    
    public function setLongitudAttribute($value)
    {
        $this->attributes['longitud'] = (float)str_replace(',', '.', $value);
    }
}

之后你直接写$centro->latitud = $request->latitud;就可以了,不用每次都重复写替换逻辑。

另外也建议检查下数据来源——比如前端是不是因为地区设置(比如西语区习惯用逗号当小数分隔符)传入了逗号,也可以考虑在前端就把逗号转成点号,后端处理会更省心。

内容的提问来源于stack exchange,提问作者Álvaro Peso García

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:14:00