如何在Laravel中正确向MySQL插入/获取JSON对象数组
Laravel JSON数组存储异常问题:错误分析与修复
核心错误:重复JSON编码
你遇到的问题根源是对JSON数据进行了多次编码,导致存入数据库的内容是经过多层转义的无效JSON,最终获取时解码异常。
具体错误点
- 控制器冗余编码:
你定义的$smsText已经是合法的JSON字符串,却额外调用json_encode($smsText, true),把JSON字符串当作普通字符串再次编码,产生大量冗余转义符。 - 模型Mutator与控制器操作冲突:
模型中为sms字段定义的set方法会自动执行json_encode,控制器提前编码后,模型再次编码,形成双重编码,这是导致异常输出的直接原因。
修复方案
方案1:直接传递原始JSON字符串(推荐)
删除控制器中多余的json_encode步骤,直接将合法JSON字符串赋值给字段,模型的Mutator会自动完成编码存储:
$smsText = '[ { "id": 1, "sentBy": "Hardik", "sms": "Mambo vipi"}, { "id": 2, "sentBy": "Vimal", "sms": "Poa sana"}, { "id": 3, "sentBy": "Harshad", "sms": "Karibu kwetu"} ]'; $input = [ // 其他字段 'sms' => $smsText // 其他字段 ]; SmsModel::create($input);
方案2:传递PHP数组给模型
如果偏好数组操作,可先将JSON字符串解码为PHP数组,再传递给模型,Mutator会自动编码为JSON存入数据库:
$smsText = '[ { "id": 1, "sentBy": "Hardik", "sms": "Mambo vipi"}, { "id": 2, "sentBy": "Vimal", "sms": "Poa sana"}, { "id": 3, "sentBy": "Harshad", "sms": "Karibu kwetu"} ]'; $smsArray = json_decode($smsText, true); $input = [ // 其他字段 'sms' => $smsArray // 其他字段 ]; SmsModel::create($input);
验证修复效果
修复后,从模型获取sms字段时,模型的Accessor会自动执行json_decode($value, true),返回正常的PHP数组,无需额外解码操作。
额外确认点
- 迁移文件中
$table->json('sms')->nullable()的配置正确,MySQL JSON类型会自动校验存储内容的合法性; - 模型
$fillable数组已包含sms字段,这部分配置无误。
内容的提问来源于stack exchange,提问作者Gabriel Rogath
相关产品推荐
相关产品推荐

