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

