Laravel关联模型查询问题:如何正确显示Bid与对应Project数据
解决Laravel中关联数据显示重复的问题
你的问题出在控制器的循环逻辑上——每次循环都会把$projects变量覆盖成当前$bid对应的项目,最后$projects只保留了最后一个bid的项目数据,所以视图里所有表格行都显示同一个项目,自然就出现了重复问题。
而且这种手动循环查项目的方式还会导致N+1查询问题(1次查询所有bids,N次分别查询每个bid对应的project),性能表现也不好。正确的做法是利用Laravel的**预加载(Eager Loading)**一次性获取关联数据,同时直接通过模型关联访问对应项目。
正确的控制器代码
// 预加载关联的projects数据,避免N+1查询问题 $bids = auth()->user()->bids()->with('projects')->get(); return view('bids.index', compact('bids'));
修正后的视图代码(index.blade.php)
@if($bids->isNotEmpty()) @foreach($bids as $bid) <tr> <!-- 直接通过关联关系获取当前bid对应的project --> <td><a href="{{ route('projects.select', $bid->projects->id) }}">{{ $bid->projects->name }}</a></td> <td>{{ $bid->status }}</td> </tr> @endforeach @else <tr> <td colspan="6" class="text-center">No record found.</td> </tr> @endif
补充说明
- 使用
with('projects')预加载后,Laravel只会执行2次查询:一次获取当前用户的所有bids,一次通过project_id批量查询对应的projects,性能比循环查询提升明显。 - 从语义角度看,每个Bid对应一个Project,你可以把Bids模型里的关联方法改成
project()(单数形式),这样视图里调用$bid->project会更符合逻辑,修改后代码如下:
视图中对应改为:// Bids.php public function project() { return $this->belongsTo('App\Projects'); }<td><a href="{{ route('projects.select', $bid->project->id) }}">{{ $bid->project->name }}</a></td>
内容的提问来源于stack exchange,提问作者Jia Soon Loo
相关产品推荐
相关产品推荐

