如何用Eloquent查询指定user_id下各option_id的最新记录?
获取指定用户每个选项最新记录的Eloquent实现
针对你提出的需求——获取指定user_id下每个option_id对应的最新记录(每个option_id仅保留一条最新条目),这里提供两种实用的Eloquent查询方案,默认以id字段的大小判断记录新旧(从你的示例数据来看,id越大的记录越新):
方法一:子查询筛选最大ID
这种方法先通过子查询找出目标用户下每个option_id的最大id(即最新记录的ID),再通过主查询匹配这些ID获取完整记录:
// 替换为你需要查询的user_id $targetUserId = 2; $latestOptions = UserOption::where('user_id', $targetUserId) ->whereIn('id', function ($query) use ($targetUserId) { $query->select(DB::raw('MAX(id)')) // 替换为你的实际数据表名称 ->from('user_options') ->where('user_id', $targetUserId) ->groupBy('option_id'); }) ->get();
方法二:关联临时表查询
通过Join操作关联一个包含每个option_id最新ID的临时表,直接获取对应完整记录:
$targetUserId = 2; $latestOptions = UserOption::select('user_options.*') ->join( DB::raw('(SELECT option_id, MAX(id) as max_id FROM user_options WHERE user_id = ? GROUP BY option_id) as latest_records'), function ($join) { $join->on('user_options.id', '=', 'latest_records.max_id'); }, false ) ->setBindings([$targetUserId]) ->get();
补充说明
- 如果你的数据表使用
created_at或updated_at时间戳来判断记录新旧,可以将子查询中的MAX(id)替换为MAX(created_at)(同时需要调整关联条件为时间字段匹配)。 - 以上代码中的
UserOption是假设的模型名称,你需要替换为自己实际的Eloquent模型类;user_options是数据表名称,也需要对应修改为你的表名。
测试验证:
- 当
$targetUserId = 2时,查询结果会包含id为241、240、75的记录; - 当
$targetUserId = 1时,会返回id为72、70的记录,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Dom
相关产品推荐
相关产品推荐

