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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:15:03