You need to enable JavaScript to run this app. 如何在Laravel中查询关联同一用户表的多字段对应名称
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel中查询关联同一用户表的多字段对应名称

实现方案

有两种常用的实现方式,分别是直接修改Query Builder查询语句,或者使用Eloquent模型关联(更符合Laravel最佳实践)。

方案1:修改原有Query Builder语句

你之前的写法仅关联了一次users表对应提交人,所以只能拿到提交人姓名。要获取另外两个角色的姓名,需要给users表设置不同别名,分别关联对应的字段即可:

$Approval_Logs = DB::table('application')
    ->select(
        'application.id',
        'application.Application_Status',
        'requestor.name as requestor_name',
        'approver.name as approver_name',
        'rejector.name as rejector_name',
        'application.Approver_id',
        'application.Rejector_id',
        'ems_application.Request_Category',
        'application.updated_at'
    )
    ->join('ems_application', 'ems_application.Application_id', '=', 'application.id')
    ->join('users as requestor', 'requestor.id', '=', 'application.Requestor_id')
    // 用leftJoin避免未审批/未驳回的申请因为关联字段为空被过滤
    ->leftJoin('users as approver', 'approver.id', '=', 'application.Approver_id')
    ->leftJoin('users as rejector', 'rejector.id', '=', 'application.Rejector_id')
    ->whereIn('application.Application_Status',['approved','rejected'])
    ->get()
    ->toArray();

方案2:使用Eloquent模型关联(更推荐)

通过定义模型关联可以让代码可读性更高,后续维护更方便,同时可以避免N+1查询问题:

  1. 首先定义Application模型的关联关系:
// app/Models/Application.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Application extends Model
{
    protected $table = 'application';

    // 关联提交人
    public function requestor(): BelongsTo
    {
        return $this->belongsTo(User::class, 'Requestor_id');
    }

    // 关联审批人
    public function approver(): BelongsTo
    {
        return $this->belongsTo(User::class, 'Approver_id');
    }

    // 关联驳回人
    public function rejector(): BelongsTo
    {
        return $this->belongsTo(User::class, 'Rejector_id');
    }

    // 关联ems_application表
    public function emsApplication(): BelongsTo
    {
        return $this->belongsTo(EmsApplication::class, 'id', 'Application_id');
    }
}
  1. 使用预加载查询数据:
$Approval_Logs = Application::with(['requestor', 'approver', 'rejector', 'emsApplication'])
    ->whereIn('Application_Status', ['approved', 'rejected'])
    ->get()
    ->map(function ($item) {
        return [
            'id' => $item->id,
            'Application_Status' => $item->Application_Status,
            'requestor_name' => $item->requestor?->name,
            'approver_name' => $item->approver?->name,
            'rejector_name' => $item->rejector?->name,
            'Approver_id' => $item->Approver_id,
            'Rejector_id' => $item->Rejector_id,
            'Request_Category' => $item->emsApplication?->Request_Category,
            'updated_at' => $item->updated_at
        ];
    })
    ->toArray();

注:代码中的?->是空安全运算符,Laravel 8及以上版本支持,若使用更低版本可以替换为optional($item->requestor)->name,避免关联数据不存在时报错。

内容的提问来源于stack exchange,提问作者Hanyi Koh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 06:24:01