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

Laravel Eloquent分组查询:关联字段分组后无法获取最新记录

Laravel分组获取每组最新选课记录解决方案

问题核心:直接用groupBy('user_id', 'course_id')配合latest()或orderBy无效,因为SQL执行顺序中分组操作早于排序,分组后只能拿到每组的第一条旧记录,而非最新的。

以下是两种可行的解决方法:

方法一:子查询获取每组最新记录ID

先通过子查询筛选出每个user_id + course_id组合对应的最大记录ID(自增ID能保证唯一性,比created_at更可靠),再用这些ID查询完整记录:

// 获取每组最新记录的ID集合
$latestEnrollIds = CourseEnrolled::selectRaw('MAX(id) as id')
    ->groupBy('user_id', 'course_id')
    ->pluck('id');

// 查询最新记录并关联关联模型
$latestEnrollments = CourseEnrolled::with('user', 'course')
    ->whereIn('id', $latestEnrollIds)
    ->orderBy('created_at', 'desc')
    ->get();

方法二:使用窗口函数(Laravel 8+)

利用SQL窗口函数给每个分组内的记录按创建时间倒序排名,直接筛选排名第一的记录:

$latestEnrollments = CourseEnrolled::with('user', 'course')
    ->selectRaw('*, ROW_NUMBER() OVER (PARTITION BY user_id, course_id ORDER BY created_at DESC, id DESC) as rn')
    ->having('rn', '=', 1)
    ->orderBy('created_at', 'desc')
    ->get();

注:额外按id DESC排序是为了避免同一分组内多条记录created_at相同的情况,确保取到真正最新的那条。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 12:15:40