Laravel Livewire 实现联动多选时关联模型数据读取报错问题
问题根因
- 当前后端返回的
$skills是Major模型的集合,并非独立的技能数据集合,技能数据是嵌套在每个Major对象内部的关联属性里,层级结构完全错位。 - 原Blade渲染逻辑没有对嵌套的关联集合做二次遍历,直接把整个关联集合当成单个技能对象取值,自然触发
Property [name] does not exist错误。 - 固定取
[0]索引的写法,仅能访问嵌套结构里的第一条关联技能,无法覆盖全部关联数据。 - 原Blade代码里的动态值没有用Blade双花括号语法包裹,就算取值逻辑正确,也会被当成纯静态字符串输出。
修正实现方案
后端调整:优化Livewire类的数据返回结构
将原本嵌套返回的专业关联数据,拍平为纯技能集合作为$skills属性的数据源,消除Blade层的嵌套遍历逻辑。
修正后的方法代码:
public function updatedSelectedMajor($major_id) { // 单专业ID选择场景:直接取出对应专业下的所有关联技能 $this->skills = \App\Models\Major::where('major_id', $major_id) ->with('mySkills') ->first() ->mySkills; }
多专业选择兼容场景的优化写法:
$this->skills = \App\Models\Major::whereIn('major_id', (array)$major_id) ->with('mySkills') ->get() ->flatMap(fn($major) => $major->mySkills) // 拍平所有专业下的技能集合为一维结构 ->unique('skills_id'); // 去重避免同一技能被多个专业关联时重复输出
前端调整:修正Blade渲染逻辑
基于拍平后的纯技能集合,直接遍历输出option项,严格对应取值要求:skills_id作为选项value,name作为选项展示文本,同时补全Blade动态值的语法包裹。
修正后的模板代码:
@if($skills->isNotEmpty()) @foreach($skills as $skill) <option value="{{ $skill->skills_id }}"> {{ $skill->name }} </option> @endforeach @else <option value="" disabled>暂无可匹配的可选技能</option> @endif
内容的提问来源于stack exchange,提问作者Mohammed Sabeel
相关产品推荐
相关产品推荐

