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

如何解决Laravel更新动态输入字段时Illegal string offset报错问题

问题原因
  • 前端表单字段name属性格式错误:你当前为每个地址字段单独设置settings[字段值]的命名方式,提交后$request->settings里的每个$value都是单独的字符串值,不是包含四个地址字段的数组,你尝试用$value['house_no']取数组下标自然会抛出非法字符串偏移错误。
  • 控制器更新逻辑错误:Address::update()不加查询条件直接调用会更新整个address表的所有记录,同时你也没有关联对应要修改的地址ID,无法定位到指定的地址行。
  • Blade模板循环内的<tr>闭合错误,你写了两个<tr>开头没有闭合,会导致表单结构异常。
修复方案

1. 修改Blade模板

你需要按地址ID为分组单位,把同一行的四个地址字段放到同一个数组下标下,代码如下:

<div>
    <table>
        <tr>
           <th>House No</th>
           <th>Street Name</th>
           <th>Area</th>
           <th>Pincode</th>
        </tr>
        @foreach ($address as $addres)
        <tr>
            <!-- 用地址ID作为分组下标,关联对应字段 -->
            <td><input type="text" name="settings[{{$addres->id}}][house_no]" value="{{ $addres->house_no}}"  class="form-control" /></td>
            <td><input type="text" name="settings[{{$addres->id}}][street_name]" value="{{ $addres->street_name}}"  class="form-control" /></td>
            <td><input type="text" name="settings[{{$addres->id}}][area]" value="{{ $addres->area}}"  class="form-control" /></td>
            <td><input type="text" name="settings[{{$addres->id}}][pincode]" value="{{ $addres->pincode}}"  class="form-control" /></td>
        </tr>
        @endforeach
    </table>
</div>

2. 修改控制器逻辑

先通过地址ID找到对应记录再更新,避免全表更新,代码如下:

public function updateUser(Request $request, $id)
{
    // 可选:先做字段验证,避免非法数据提交
    $validated = $request->validate([
        'settings' => 'required|array',
        'settings.*.house_no' => 'required|string',
        'settings.*.street_name' => 'required|string',
        'settings.*.area' => 'required|string',
        'settings.*.pincode' => 'required|numeric',
    ]);
    
    foreach ($request->settings as $addressId => $addressData) {
        // 按ID找到对应地址记录再更新
        Address::where('id', $addressId)->update($addressData);
    }

    // 后续可根据需求添加返回逻辑
    return back()->with('success', '地址更新成功');
}

额外注意事项

请确认你的Address模型已经把四个地址字段加入到$fillable属性中,否则会被Laravel的批量赋值保护机制拦截更新:

// 写入到Address.php模型类中
protected $fillable = ['house_no', 'street_name', 'area', 'pincode'];

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:36:08