You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:36:49