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
相关产品推荐
相关产品推荐

