Laravel中如何根据专业ID显示专业名称?
解决学生列表显示专业ID而非专业名称的问题
问题说明
学生列表的专业列目前直接显示专业ID,需通过关联专业表,根据ID展示对应的专业名称。
现有代码回顾
Model(Mahasiswa.php)
public function prodi() { return $this->belongsTo(Prodi::class, 'prodi'); } public function toSearchableArray(): array { return [ 'nama' => $this->nama, 'nim' => $this->nim, ]; }
Controller(MahasiswaController.php)
public function index(Request $request) { if ($request->keyword) { $mahasiswa = Mahasiswa::where('is_delete', null)->search($request->keyword)->paginate(PHP_INT_MAX); } else { $mahasiswa = Mahasiswa::where('is_delete', null)->paginate(PHP_INT_MAX); } return view('mahasiswa.daftar_mahasiswa', compact('mahasiswa')); } // 其余方法完整代码见问题描述
View(daftar_mahasiswa.blade.php)
<tbody> @foreach ($mahasiswa as $mhs) <tr> <td>{{ $loop->iteration }}</td> <td>{{ $mhs->nama }}</td> <td>{{ $mhs->nim }}</td> <td>{{ $mhs->prodi }}</td> <!-- 当前显示专业ID --> <td>{{ $mhs->j_kel }}</td> <!-- 操作按钮代码省略 --> </tr> @endforeach </tbody>
修改步骤
1. 优化Model关联(可选但推荐)
当前关联方法名prodi()与数据库字段名prodi重名,易造成混淆,建议修改关联方法名避免冲突:
// Mahasiswa.php public function prodiData() { return $this->belongsTo(Prodi::class, 'prodi'); }
若不修改方法名,后续需通过
->prodi->字段名访问关联模型属性,而非直接访问字段。
2. Controller预加载关联数据(避免N+1查询)
在查询学生数据时,通过with()预加载专业关联,提升页面性能:
// MahasiswaController.php - index方法 public function index(Request $request) { $query = Mahasiswa::where('is_delete', null); if ($request->keyword) { $mahasiswa = $query->search($request->keyword)->with('prodi')->paginate(PHP_INT_MAX); } else { $mahasiswa = $query->with('prodi')->paginate(PHP_INT_MAX); } return view('mahasiswa.daftar_mahasiswa', compact('mahasiswa')); } // 同步更新show和exportpdf方法的查询逻辑 public function show($id) { return view('mahasiswa.daftar_mahasiswa-detail', [ 'mahasiswa' => Mahasiswa::with('prodi')->findOrFail($id), ]); } public function exportpdf() { $datas = Mahasiswa::with('prodi')->get(); $pdf = Pdf::loadView('mahasiswa.pdf', ['datas' => $datas]); return $pdf->download('Data Mahasiswa -' . Carbon::now()->format('Y-m-d') . '.pdf'); }
3. View模板修改为显示专业名称
将显示专业ID的代码,改为访问关联模型的专业名称字段(假设Prodi模型中专业名称字段为nama,请根据实际字段名调整):
<!-- daftar_mahasiswa.blade.php --> <td>{{ $mhs->prodi->nama ?? '未关联专业' }}</td>
添加
?? '未关联专业'是为了处理专业ID无效或未关联的异常情况,避免页面报错。
4. 修复Update方法的字段遗漏(可选)
当前update方法未处理专业字段的更新,若需支持修改学生专业,补充以下代码:
public function update(Request $request, $id) { $mahasiswa = Mahasiswa::find($id); $mahasiswa->update([ 'nim' => $request->get('nim'), 'nama' => $request->get('nama'), 'j_kel' => $request->get('j_kel'), 'prodi' => $request->get('prodi') // 新增专业字段更新逻辑 ]); Alert::success('Berhasil 🎉🥳', 'Berhasil mengubah data mahasiswa'); return redirect()->route('mahasiswa.index'); }
内容的提问来源于stack exchange,提问作者ieulan
相关产品推荐
相关产品推荐

