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

Laravel控制器访问对象内数组报Cannot access offset of type string on string错误

问题原因
  • Client模型的attributes字段是存储在数据库中的JSON格式字符串,你没有对它做解码就直接使用数组偏移[]访问,字符串类型无法通过数组键名取值,因此触发Cannot access offset of type string on string报错。
  • 你拼写错误了目标字段名:返回的JSON结构中字段是offer_letter_variables(letter为单数),而代码里写的是offer_letters_variables(letter为复数,多了一个s),就算完成解码也会因找不到对应键报错。
  • 额外注意:后续创建User时直接把Collection类型的$attr赋值给attributes字段,如果User模型的attributes字段也是JSON存储,未做格式转换也会出现存储异常。
解决方案

方案1:临时解码(单次使用)

遍历前先对attributes字段做JSON解码,同时修正字段名即可:

// 第二个参数传true表示返回关联数组,不传默认返回stdClass对象
$clientAttributes = json_decode($client->attributes, true);
$offer_letters_variables = collect([]);

// 修正字段名,使用正确的offer_letter_variables
foreach ($clientAttributes['offer_letter_variables'] as $variable){
    // $request->input()第二个参数可直接设置默认值,替代isset三元判断
    $offer_letters_variables->put($variable, $request->input($variable, 0));
}

方案2:模型配置自动转换(推荐长期使用)

在Client模型中添加$casts属性,让Laravel自动完成JSON和数组的双向转换,不需要每次手动编解码:

// 在app/Models/Client.php中添加配置
protected $casts = [
    'attributes' => 'array', // 如果你习惯用集合操作也可以填'collection'
];

配置完成后可直接通过$client->attributes['offer_letter_variables']访问对应值,无需手动解码,保存字段时也会自动转为JSON存入数据库。

如果你的User模型的attributes字段也是JSON类型,也给它加上相同的cast配置,创建用户时传入数组即可:

$attr = ['offer_letter_variables' => $offer_letters_variables->toArray()];

内容的提问来源于stack exchange,提问作者opia austin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:36:02