Laravel使用findOrFail更新数据后array字段自动加反斜杠转义问题
问题原因
- 两种update写法的核心差异在于是否触发模型的
$casts逻辑:- 你之前使用
Raid::where('id', $request['id'])->update($request->all())是直接调用查询构造器的更新方法,不会执行模型定义的类型转换逻辑,参数会直接写入数据库,所以运行正常。 - 你现在使用的「先查模型实例再调用实例update」的写法,会触发模型中定义的
array类型转换:Laravel会自动把传入的字段值做json_encode处理后再入库。如果你的请求参数中traders、class_traders字段本身已经是前端传入的JSON字符串,就会导致双重JSON编码,最终入库的内容就会多出转义反斜杠。
- 你之前使用
- 补充:你现有代码中
$sql = $sql->update($request->all())的写法存在不规范问题,update方法返回的是布尔类型的更新结果,会直接覆盖你之前查询到的模型实例,若后续需要操作更新后的模型数据会触发异常。
解决方案
你可以根据实际业务场景任选一种方案修复:
- 调整前端传参逻辑:让前端直接传入数组格式的
traders、class_traders参数,不要提前转成JSON字符串,Laravel的array类型转换会自动把数组转为标准JSON入库,不会出现转义问题。 - 后端手动处理参数:如果无法修改前端传参逻辑,在调用更新前先把对应JSON字符串转为数组即可,示例代码如下:
$raid = Raid::findOrFail($request['id']); $params = $request->all(); // 手动解码JSON字符串为数组,避免双重编码 $params['traders'] = json_decode($params['traders'], true); $params['class_traders'] = json_decode($params['class_traders'], true); $raid->update($params);
- 自定义模型转换逻辑:如果这类场景是通用需求,可以为对应字段编写自定义类型转换,自动识别传入的是JSON字符串还是数组,避免重复编码。
内容的提问来源于stack exchange,提问作者Alireza Behnamnik
相关产品推荐
相关产品推荐

