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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:50:55