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

Laravel项目中如何关联用户表与部门表并显示部门名称

解决Laravel中用户与部门关联展示的优雅方案

1. 定义Eloquent模型关联

首先在对应模型中定义表之间的关联关系:

User模型(app/Models/User.php)

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    // 一个用户属于一个部门
    public function office()
    {
        return $this->belongsTo(Office::class);
    }
}

Office模型(可选,app/Models/Office.php)

如果需要从部门反向查询用户,可添加一对多关联:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Office extends Model
{
    // 一个部门拥有多个用户
    public function users()
    {
        return $this->hasMany(User::class);
    }
}

2. 优化控制器:使用预加载避免N+1查询

修改控制器代码,通过with('office')预加载关联的部门数据,避免循环查询每个用户部门时的性能问题:

public function users()
{
    // 预加载用户关联的部门数据
    $users = User::with('office')->get();

    return view('admin.users')->with('funcionarios', $users);
}

注:原控制器代码存在语法错误:'offices => $offices缺少闭合引号,且无需单独传递$offices变量。

3. 修改视图:直接调用关联数据展示部门名称

修正视图中的变量错误,通过关联直接获取部门名称,同时处理部门不存在的异常情况:

<table class="table">
    <thead class="thead-light">
    <tr>
        <th scope="col">ID</th>
        <th scope="col">Name</th>
        <th scope="col">office</th>
    </tr>
    </thead>
    <tbody>
    <!-- 控制器传递的变量是funcionarios,而非users -->
    @foreach($funcionarios as $user)
        <tr class="list-group-item-action bg-primary">
            <!-- 修正原代码变量错误:$funcionario改为$user -->
            <th scope="row">{{$user->id}}</th>
            <td><a style="cursor:pointer;" class="checkuser  text-white"
                   data-id="{{$user->id}}">
                    {{$user->name}}
                </a></td>
            <!-- 通过关联获取部门名称,用??处理部门不存在的情况 -->
            <td>{{$user->office->name ?? '无部门'}}</td>
        </tr>
    @endforeach
    </tbody>
</table>

核心优势

  • 简洁优雅:通过Eloquent关联直接访问关联数据,无需手动循环判断
  • 性能优化:预加载with('office')避免N+1查询问题,提升页面加载效率
  • 健壮性:使用??运算符处理部门不存在的场景,避免页面报错

内容的提问来源于stack exchange,提问作者Filipe Cruz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:31:09