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
相关产品推荐
相关产品推荐

