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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:30:49