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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:06:07