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

Laravel 9中如何按用户分组获取最新状态为sent的记录

筛选最新状态为sent的用户记录

原始数据

数据库表中现有数据:

id | user_id | status
1  | 7 | sent
2  | 7 | pending
3  | 8 | pending
4  | 8 | sent

预期结果

需要得到仅最新状态为sent的用户记录:

id | user_id | status
4  | 8 | sent

当前查询的问题

使用以下Laravel查询无法得到预期结果:

MyTable::where('status', 'sent')->groupBy('user_id')->get();

返回结果包含了user_id=7的旧状态记录:

id | user_id | status
1  | 7 | sent
4  | 8 | sent

因为user_id=7的最新状态是pending,需要将这类用户排除。

Laravel 9 解决方案

方法1:子查询获取最新id再筛选

先找出每个用户的最新记录id,再筛选其中状态为sent的:

// 获取每个用户的最新记录id
$latestIds = MyTable::selectRaw('MAX(id) as max_id')
    ->groupBy('user_id')
    ->pluck('max_id');

// 筛选最新状态为sent的记录
$result = MyTable::whereIn('id', $latestIds)
    ->where('status', 'sent')
    ->get();

方法2:关联子查询一步完成

通过join子查询直接关联到每个用户的最新记录,再筛选状态:

$result = MyTable::join(
    // 子查询:每个用户的最新记录id
    MyTable::select('user_id', \DB::raw('MAX(id) as max_id'))
        ->groupBy('user_id'),
    function ($join) {
        $join->on('my_table.id', '=', 'max_id')
             ->on('my_table.user_id', '=', 'user_id');
    }
)
->where('status', 'sent')
->select('my_table.*')
->get();

方法3:利用Eloquent关联(适合有User模型场景)

如果有对应的User模型,先给User添加关联获取最新状态:

// 在User模型中定义关联
public function latestStatus()
{
    return $this->hasOne(MyTable::class)->latest('id');
}

然后查询拥有最新状态为sent的用户,并获取对应的状态记录:

$usersWithSentStatus = User::whereHas('latestStatus', function ($query) {
    $query->where('status', 'sent');
})->with('latestStatus')->get();

// 提取状态记录集合
$result = $usersWithSentStatus->pluck('latestStatus');

以上方法都能准确得到你需要的结果,核心是先确定每个用户的最新状态,再筛选出其中状态为sent的记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 09:57:40