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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:03:13