如何在Laravel Eloquent查询中获取多级关联模型的指定字段
Laravel 多层关联模型指定字段查询实现
需求背景
需要在3个存在关联的模型中仅查询指定字段,关联规则如下:
- 1个User对应1个Rank
- 1个User可对应多个TchatMessage
需要返回的字段清单: - TchatMessage模型:
content、created_at - User模型:
username - Rank模型:
color、icon
初始查询问题
初始查询会返回三个模型的所有字段,存在冗余:
return TchatMessage::with(['user' => function($user){ $user->with(['rank'])->get(); }])->orderBy('created_at', 'desc')->limit(2)->get();
关联关系定义
User模型TchatMessage关联
public function tchatMessages() { return $this->hasMany(TchatMessage::class); }
TchatMessage模型User关联
public function user() { return $this->belongsTo('App\Models\User'); }
User模型Rank关联
public function rank() { return $this->belongsTo( 'App\Models\Rank' ); }
优化过程
第一次优化后已实现仅返回User的username字段,但Rank模型仍返回全部字段:
return TchatMessage::query() ->with(array('user' => function($query) { $query->select('id','rank_id','username') ->with('rank'); })) ->orderBy('created_at', 'desc')->limit(2)->get();
最终可执行方案
通过关联名后紧跟冒号加指定字段的方式筛选Rank的返回字段,同时指定TchatMessage本身的返回字段即可完成需求,注意关联所需的外键字段必须包含在查询列表中,否则关联会失效:
return TchatMessage::query() ->with(array('user' => function($query) { $query->select('id','rank_id','username') ->with('rank:id,color,icon'); })) ->select('content', 'user_id', 'created_at') ->orderBy('created_at', 'desc')->limit(2)->get();
内容的提问来源于stack exchange,提问作者Kylian
相关产品推荐
相关产品推荐

