Laravel视图展示含JSON字段的关联表数据异常问题求助
解决Laravel中JSON格式关联字段展示错误的问题
问题背景
需要在Laravel视图中展示关联表字段,其中ref_appointment表的type_of_exam_id字段为JSON格式(支持单个ID或ID数组),但当前实现会列出所有考试类型描述,即使仅选择了单个考试。
表结构
ref_code_exam表
| id | description |
|---|---|
| 1 | Exam 1 |
| 2 | Exam 2 |
| 3 | Exam 3 |
ref_appointment表
| id | registry_id | type_of_exam_id |
|---|---|---|
| 1 | 10 | 2 |
| 2 | 11 | ["1","2","3"] |
问题根源
- 累积ID导致查询范围错误:原控制器中每次循环都会把当前记录的
type_of_exam_id追加到$apptype1数组,后续查询会包含所有之前记录的ID,导致每个记录都显示所有历史查询的考试类型。 - 未正确处理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
相关产品推荐
相关产品推荐

