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

选择单选框后无法访问变量,Laravel Livewire报错

解决Livewire单选按钮组选择时的“Attempt to read property 'id' on array”错误

你遇到的问题核心有两个:一是单选按钮缺少value属性,导致Livewire无法正确绑定选中值;二是组件传递的Eloquent模型在Livewire序列化/反序列化过程中被转为数组,模板里仍用对象语法访问属性引发报错。

修复步骤

1. 给单选按钮添加value属性

没有value的话,Livewire无法识别你选中的是哪个选项,会触发异常的属性更新逻辑。同时调整模板中模型属性的访问方式,避免直接操作数组索引中的模型:

修改组件blade文件:

<div>
@foreach($options['items'] as $itemGroup)
    @php
        $optionModel = $itemGroup[0];
    @endphp
    <div class="custom-control custom-radio">
        <input 
             wire:model="selected" 
             class="custom-control-input" 
             type="radio"
             id="rdio_{{ $optionModel->id }}_{{ $options['option']->id }}"
             value="{{ $optionModel->id }}"> <!-- 必须添加value属性 -->

        <label class="custom-control-label" for="rdio_{{ $optionModel->id }}_{{ $options['option']->id }}">
            {{ $optionModel->title }}
        </label>
    </div>
@endforeach
</div>

2. 优化组件的模型数据处理(可选但推荐)

如果不想依赖Livewire对Eloquent模型的序列化处理,可以在组件初始化时把模型转换为纯数组,避免后续反序列化时模型变数组的问题:

修改组件类:

class TestOptions extends Component {
    public $selected;
    public $options;

    public function mount($options)
    {
        // 提取模型中需要的字段转为数组,避免序列化问题
        $this->options = [
            'option' => [
                'id' => $options['option']->id,
                // 按需添加其他需要的字段
            ],
            'items' => collect($options['items'])->map(function($group) {
                $model = $group[0];
                return [
                    'id' => $model->id,
                    'title' => $model->title
                ];
            })->toArray()
        ];
    }

    public function render()
    {
        return view('livewire.test-options');
    }
}

对应的模板也要改成数组访问语法:

<div>
@foreach($options['items'] as $item)
    <div class="custom-control custom-radio">
        <input 
             wire:model="selected" 
             class="custom-control-input" 
             type="radio"
             id="rdio_{{ $item['id'] }}_{{ $options['option']['id'] }}"
             value="{{ $item['id'] }}">

        <label class="custom-control-label" for="rdio_{{ $item['id'] }}_{{ $options['option']['id'] }}">
            {{ $item['title'] }}
        </label>
    </div>
@endforeach
</div>

这样修改后,单选按钮的绑定逻辑会正常工作,也不会再出现数组访问对象属性的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 02:05:23