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

