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

Laravel 如何查询集合中每个foreign_id对应的最新id记录

Laravel 按外键分组取最大ID记录实现方案

一、Query Builder 直接查询数据库实现(推荐)

该方案兼容MySQL默认的ONLY_FULL_GROUP_BY SQL模式,不会出现语法报错:

// 替换your_table_name为你的实际表名
$latestRecords = DB::table('your_table_name as t1')
    ->joinSub(
        // 子查询先获取每个foreign_id对应的最大id值
        DB::table('your_table_name')
            ->select('foreign_id', DB::raw('MAX(id) as max_id'))
            ->groupBy('foreign_id'),
        't2',
        function ($join) {
            $join->on('t1.foreign_id', '=', 't2.foreign_id')
                 ->on('t1.id', '=', 't2.max_id');
        }
    )
    ->select('t1.*')
    ->get();

二、已拿到集合后的处理实现

如果你已经拿到了完整的集合数据,可以直接用Laravel集合自带方法处理:

$processedResult = $collection
    // 先按id倒序排列,让每个foreign_id对应的最大id记录排在最前
    ->sortByDesc('id')
    // 按foreign_id去重,默认保留第一个出现的记录,也就是最大id的那条
    ->unique('foreign_id')
    // 可选:如果需要结果按id升序排列可以加这行,不需要可以删除
    ->sortBy('id')
    // 重置集合的索引
    ->values();

简易写法(不推荐,仅做参考)

如果你的MySQL环境关闭了ONLY_FULL_GROUP_BY模式,也可以用更简单的写法,但存在兼容性风险:

$latestRecords = DB::table('your_table_name')
    ->orderBy('id', 'desc')
    ->groupBy('foreign_id')
    ->get();

内容的提问来源于stack exchange,提问作者maxx96

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:39:03