Laravel 8 Eloquent如何通过嵌套关联获取最新关联表数据
实现方案
方案1:嵌套关联+访问器(推荐,符合Eloquent使用规范)
第一步:定义各模型关联
首先在Track模型中新增和Event的关联:
// app/Models/Track.php public function event() { return $this->belongsTo(Event::class); }
你之前已经在Main模型中定义了最新Track的关联,保留即可:
// app/Models/Main.php public function latestTrack() { return $this->hasOne(Track::class)->latestOfMany(); }
第二步:预加载嵌套关联查询
查询时使用嵌套预加载,一次性拿到关联的最新Track和对应的Event数据:
$mains = Main::with('latestTrack.event')->get();
第三步:(可选)添加快捷访问器
如果你想直接从Main实例拿到最终的Last Event值,可以在Main模型中添加访问器:
// app/Models/Main.php // Laravel 8及更早版本写法,高版本可使用新的访问器语法 public function getLastEventAttribute() { // 空安全运算符避免无关联数据时报错 return $this->latestTrack?->event?->name; }
输出数据
最终你可以直接按需求组装数据:
foreach ($mains as $main) { $item = [ 'Main ID' => $main->id, 'Name' => $main->name, 'SN' => $main->sn, 'Last Event' => $main->last_event, // 加了访问器直接调用即可 // 未加访问器可以直接写:$main->latestTrack?->event?->name ]; }
方案2:子查询直接获取字段(适合SQL层面直接拼接字段场景)
如果你不想通过关联层级访问,希望查询结果直接带上last_event字段,可以用子查询实现:
$mains = Main::select('*') ->addSelect(['last_event' => Event::select('name') ->whereIn('id', Track::select('event_id') ->whereColumn('main_id', 'mains.id') ->latest('created_at') ->take(1) ) ]) ->get(); // 直接访问即可 echo $mains[0]->last_event; // 输出RIGHT
内容的提问来源于stack exchange,提问作者Nathan Bryan
相关产品推荐
相关产品推荐

