Laravel多表关联:如何获取用户参与的所有项目集合
解决Laravel中获取用户参与所有项目的问题
我来帮你搞定这个问题~你现在的核心问题是在循环里每次覆盖了$projects变量,导致最后只有最后一个项目被传递到视图,而且这种循环查库的方式还会造成N+1查询问题(每个注册记录都单独查一次项目表),效率很低。咱们用Laravel的Eloquent关联来优雅解决:
方案一:定义多对多关联(推荐)
你的users和projects表通过registrations中间表形成了多对多关系,直接在User模型里定义这个关联,就能一步拿到所有参与的项目:
修改User.php模型
添加一个新的关联方法:
public function participatedProjects() { // 参数依次是关联模型、中间表名、当前模型在中间表的外键、关联模型在中间表的外键 return $this->belongsToMany(Project::class, 'registrations', 'user_id', 'project_id'); }
修改控制器ProjectsController.php的index方法
现在可以直接获取所有参与的项目集合,无需循环:
public function index() { // 预加载关联,避免N+1查询 $participatedProjects = auth()->user()->participatedProjects; return view('projects.index', compact('participatedProjects')); }
修改视图index.blade.php
直接遍历项目集合即可:
@extends('layouts.app') @section('content') <h1 class="title">Cases</h1> <ul> @foreach ($participatedProjects as $project) <li> <a href="/projects/{{ $project->id }}"> {{ $project->title }} </a> </li> @endforeach </ul> @endsection
方案二:利用现有关联(无需新增关联方法)
如果不想修改模型,也可以通过现有registrations关联预加载对应的project,然后在视图里遍历注册记录获取项目:
修改控制器ProjectsController.php的index方法
public function index() { // 预加载每个注册记录对应的项目,避免N+1查询 $registrations = auth()->user()->registrations()->with('project')->get(); return view('projects.index', compact('registrations')); }
修改视图index.blade.php
遍历注册记录,取出每个记录关联的项目:
@extends('layouts.app') @section('content') <h1 class="title">Cases</h1> <ul> @foreach ($registrations as $registration) <li> <a href="/projects/{{ $registration->project->id }}"> {{ $registration->project->title }} </a> </li> @endforeach </ul> @endsection
为什么你原来的代码只返回最后一个项目?
你原来的代码里,每次循环$registrations时,都会执行$projects = Project::where('id', $project_id)->get();,这会把$projects变量重新赋值为当前项目的集合,覆盖之前的内容。循环结束后,$projects自然只保留了最后一次循环的结果。而且这种方式每个注册记录都要查一次数据库,性能很差,上面的两种方案都能避免这个问题。
内容的提问来源于stack exchange,提问作者Ingo T
相关产品推荐
相关产品推荐

