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

Laravel视图展示含JSON字段的关联表数据异常问题求助

解决Laravel中JSON格式关联字段展示错误的问题

问题背景

需要在Laravel视图中展示关联表字段,其中ref_appointment表的type_of_exam_id字段为JSON格式(支持单个ID或ID数组),但当前实现会列出所有考试类型描述,即使仅选择了单个考试。

表结构

ref_code_exam表

iddescription
1Exam 1
2Exam 2
3Exam 3

ref_appointment表

idregistry_idtype_of_exam_id
1102
211["1","2","3"]

问题根源

  1. 累积ID导致查询范围错误:原控制器中每次循环都会把当前记录的type_of_exam_id追加到$apptype1数组,后续查询会包含所有之前记录的ID,导致每个记录都显示所有历史查询的考试类型。
  2. 未正确处理JSON格式:type_of_exam_id可能是单个字符串ID或JSON数组,原代码未统一解析为数组格式,导致whereIn查询逻辑失效。

解决方案

修改控制器代码

$data = $this->data();
$apptype1 = [];

foreach ($data as $v) {
    // 解析JSON格式的考试ID,统一转为数组
    $examIds = json_decode($v->type_of_exam_id);
    // 处理单个ID的情况,转为单元素数组
    if (!is_array($examIds)) {
        $examIds = [$examIds];
    }

    // 查询当前记录对应的所有考试描述
    $typeOfApps = DB::table('ref_code_exam')
        ->whereIn('id', $examIds)
        ->pluck('description');

    // 存储当前记录对应的考试描述数组
    $apptype1[$v->id] = $typeOfApps->toArray();
}

return view('transactions.pendapp', ['data' => $data, 'apptype1' => $apptype1])
    ->with('i', (request()->input('page', 1) - 1) * 10);

修改视图代码

@foreach($data as $students)
    <tr>
        <td>{{ ++$i }}</td>
        <td>{{ $students->applicant_no }}</td>
        <td>{{ $students->stud_fname }}</td>
        <td>{{ $students->stud_mname }}</td>
        <td>{{ $students->stud_lname }}</td>
        <td>
            @if(isset($apptype1[$students->id]) && count($apptype1[$students->id]) > 0)
                <ul>
                    @foreach($apptype1[$students->id] as $description)
                        <li>{{ $description }}</li>
                    @endforeach
                </ul>
            @else
                无考试类型
            @endif
        </td>
    </tr>
@endforeach

关键修改说明

  • 控制器:每次循环仅处理当前记录的考试ID,解析JSON确保为数组格式,查询仅针对当前记录的ID,避免累积查询范围。
  • 视图:简化循环逻辑,直接遍历当前记录对应的考试描述数组,增加空值判断提升健壮性。

内容的提问来源于stack exchange,提问作者Emma Ruth Galvez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:47:43