如何在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查询问题:
- 首先定义
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'); } }
- 使用预加载查询数据:
$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
相关产品推荐
相关产品推荐

