使用Inner Join填充关联表列值及视图循环渲染问题
解决外键关联字段显示问题
方法一:使用Eloquent关联(推荐)
你已经在MasterModel中定义了与Fighter的belongsTo关联,直接利用这个关联就能轻松获取拳手名称,还能避免N+1查询问题,同时保留分页功能。
1. 修改MasterController的index方法
将原代码中的$master查询改为预加载关联:
public function index() { // 预加载fighter关联,提升查询效率 $master = MasterModel::with('fighter')->paginate(5); return view('master.master', compact('master')); }
注:记得修正MasterModel中的属性名错误:protected $primary_key改为protected $primaryKey(Laravel要求驼峰命名)
2. 在Blade视图中渲染关联数据
在foreach循环里,直接通过关联对象获取拳手名称,同时处理无关联的情况避免报错:
@foreach ($master as $msf) <tr> <td> {{ $msf->id }} </td> <td> {{ $msf->name}} </td> <td> {{ $msf->martial_art }} </td> <td> {{ $msf->nacionality }} </td> <td> {{ $msf->genre->value }} </td> <td> {{ $msf->height }} m</td> <td> {{ $msf->weight }} kg</td> <!-- 显示关联的拳手名称,无关联时显示默认文本 --> <td> {{ $msf->fighter->name ?? '无关联拳手' }} </td> <td> <form action="{{ url("delete-master/$msf->id") }}" method="POST"> <a href="{{ url("update-master/$msf->id") }}" class="btn btn-primary"><i class="fa fa-arrows-rotate"></i> Update</a> @csrf @method('DELETE') <x-primary-button class="ml-3"> {{ __('Delete') }} </x-primary-button> </form> </td> </tr> @endforeach
方法二:使用自定义Join查询
如果你坚持使用自己写的$fk查询,需要调整查询逻辑并修改视图循环对象:
1. 修改MasterController的index方法
给fighter.name起别名避免字段冲突,同时改为分页查询:
public function index() { $fk = DB::table('master') ->join('fighter', 'fighter.id', '=', 'master.id_fighter') ->select( 'master.id', 'master.name', 'master.martial_art', 'master.nacionality', 'master.genre', 'master.height', 'master.weight', 'fighter.name as fighter_name' // 字段别名 ) ->paginate(5); return view('master.master', compact('fk')); }
2. 在Blade视图中渲染Join结果
将循环对象改为$fk,并使用别名获取拳手名称:
@foreach ($fk as $msf) <tr> <td> {{ $msf->id }} </td> <td> {{ $msf->name}} </td> <td> {{ $msf->martial_art }} </td> <td> {{ $msf->nacionality }} </td> <td> {{ $msf->genre->value }} </td> <td> {{ $msf->height }} m</td> <td> {{ $msf->weight }} kg</td> <!-- 使用别名显示拳手名称 --> <td> {{ $msf->fighter_name }} </td> <td> <form action="{{ url("delete-master/$msf->id") }}" method="POST"> <a href="{{ url("update-master/$msf->id") }}" class="btn btn-primary"><i class="fa fa-arrows-rotate"></i> Update</a> @csrf @method('DELETE') <x-primary-button class="ml-3"> {{ __('Delete') }} </x-primary-button> </form> </td> </tr> @endforeach
内容的提问来源于stack exchange,提问作者Gapih
相关产品推荐
相关产品推荐

