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

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方法返回的是布尔类型的更新结果,会直接覆盖你之前查询到的模型实例,若后续需要操作更新后的模型数据会触发异常。
解决方案

你可以根据实际业务场景任选一种方案修复:

  1. 调整前端传参逻辑:让前端直接传入数组格式的traders、class_traders参数,不要提前转成JSON字符串,Laravel的array类型转换会自动把数组转为标准JSON入库,不会出现转义问题。
  2. 后端手动处理参数:如果无法修改前端传参逻辑,在调用更新前先把对应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);
  1. 自定义模型转换逻辑:如果这类场景是通用需求,可以为对应字段编写自定义类型转换,自动识别传入的是JSON字符串还是数组,避免重复编码。

内容的提问来源于stack exchange,提问作者Alireza Behnamnik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:36:07