Laravel Eloquent实现JSON数组存储关联表的查询与更新
问题修复与功能实现
核心错误原因
你当前已选技能查询逻辑存在两个问题:
- 查询已选技能时使用
=匹配json_decode返回的ID数组,SQL单值匹配只会取数组第一个元素作为查询条件,因此只能返回1条技能记录 - 冗余查询
$skills = Skill::where('skill_id', '=', $id)->get();逻辑无效,$id是当前登录候选人的ID,并非技能ID,无法查询到对应技能数据
完整实现步骤
1. 配置模型JSON字段自动转换
首先在Candidates模型中添加字段类型转换,无需每次手动调用json_encode/json_decode处理技能字段:
// 文件路径:app/Models/Candidates.php protected $casts = [ 'skills' => 'array', // 读取时自动转数组,写入时自动转JSON ];
2. 修正技能页加载方法(实现已选技能正确回显)
替换原有profile_skills方法代码:
public function profile_skills(){ $title = "Skills & Resume Settings"; $canId = session()->get('can_id'); $candidate = Candidates::find($canId); // 查询全量技能列表供前端选择 $allSkills = Skill::all(); // 用whereIn匹配所有已选技能ID,空值时返回空集合避免查询报错 $selectedSkills = empty($candidate->skills) ? collect() : Skill::whereIn('skill_id', $candidate->skills)->get(); return view('Candidate.skills', compact( 'title', 'candidate', 'allSkills', 'selectedSkills' )); }
3. 实现技能更新功能
首先添加路由对应更新方法,编写更新逻辑:
public function updateSkills(Request $request){ // 校验入参:技能必须是数组,每个ID必须在技能表存在 $request->validate([ 'skills' => 'nullable|array', 'skills.*' => 'exists:skills,skill_id', ]); $canId = session()->get('can_id'); $candidate = Candidates::find($canId); // 直接赋值数组,模型会自动转成JSON存入数据库 $candidate->skills = $request->input('skills', []); $candidate->save(); return redirect()->back()->with('status', '技能信息更新成功'); }
4. Blade模板渲染逻辑
多选下拉框回显
<select name="skills[]" multiple class="form-control"> @foreach($allSkills as $skill) <option value="{{ $skill->skill_id }}" {{ in_array($skill->skill_id, old('skills', $candidate->skills ?? [])) ? 'selected' : '' }}> {{ $skill->skill_name }} </option> @endforeach </select>
已选技能列表展示
<div class="skill-list"> @foreach($selectedSkills as $skill) <span class="badge badge-primary mr-2">{{ $skill->skill_name }}</span> @endforeach </div>
内容的提问来源于stack exchange,提问作者aamir anwar
相关产品推荐
相关产品推荐

