Laravel put()方法混合内容问题:JSON与非JSON兼容
Laravel中put()插入JSON内容时转义问题及兼容现有功能的解决方案
问题核心
- 使用
put()方法插入手动拼接的JSON字符串时,生成内容带有转义反斜杠,str_replace()和stripslashes()无法解决 - 为
dvalue字段添加array类型的casts配置后,破坏了现有访问器与修改器功能 - 数据库中
dvalue字段存在非JSON格式的混合内容,需要兼容处理
解决方案
1. 避免手动拼接JSON字符串,直接传入数组
手动拼接JSON字符串是转义问题的根源,直接传入关联数组即可避免转义:
// 替换手动拼接的JSON字符串为数组 $datatable->GroupsCollection = $datatable->GroupsCollection->put($job, ['grade' => $grade]);
存入数组结构后,后续处理不会产生不必要的转义字符。
2. 调整修改器适配array casts(若需保留casts配置)
如果必须保留dvalue字段的array类型casts,需修改setGroupsCollectionAttribute方法,正确处理Collection与数组的转换:
public function setGroupsCollectionAttribute($value) { // 确保当前dvalue是数组(casts已自动转换) $currentValue = $this->dvalue ?? []; // 将传入的Collection转为数组存入groups字段 $currentValue['groups'] = $value->toArray(); $this->dvalue = $currentValue; }
同时确保访问器返回Collection的逻辑正常:
public function getGroupsCollectionAttribute() { // 从数组类型的dvalue中取出groups,转为Collection return collect($this->dvalue['groups'] ?? null); }
3. 兼容非JSON混合内容的折中方案
若数据库中dvalue存在非JSON内容,不建议使用全局casts,手动处理JSON的编码与解析更稳妥:
调整访问器
public function getGroupsCollectionAttribute() { $dvalue = $this->dvalue; // 尝试将字符串解析为数组,解析失败则保留原内容 if (is_string($dvalue)) { $parsed = json_decode($dvalue, true); $dvalue = $parsed !== null ? $parsed : $dvalue; } // 将groups转为Collection返回 return collect($dvalue['groups'] ?? null); }
调整修改器
public function setGroupsCollectionAttribute($value) { $dvalue = $this->dvalue; // 处理原dvalue:字符串尝试解析为数组,非数组则转为空数组 if (is_string($dvalue)) { $parsed = json_decode($dvalue, true); $dvalue = $parsed !== null ? $parsed : []; } elseif (!is_array($dvalue)) { $dvalue = []; } // 将Collection转为数组存入groups $dvalue['groups'] = $value->toArray(); // 手动编码为JSON字符串,避免转义问题 $this->dvalue = json_encode($dvalue); }
总结
最简便的解决方式是直接传入数组替代手动拼接JSON字符串,同时调整修改器正确处理Collection到数组的转换。若需兼容数据库中的非JSON内容,手动处理JSON的编码解析是更稳妥的选择。
内容的提问来源于stack exchange,提问作者mickeygeecom
相关产品推荐
相关产品推荐

