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
相关产品推荐
相关产品推荐

