Laravel Eloquent 按用户分组并按 Max(date) 排序

问题描述 投票:0回答:1

我有下表。我实际上正在设计一个简单的聊天,所以,我们有user_id(发送消息的人)和user_id_to(接收消息的人)。

id 用户ID 用户 ID 发送日期
1 1 2 2023年1月2日
2 2 1 2023年2月2日
3 3 1 2023年3月2日
4 1 2 2023年5月3日
5 2 1 2023年3月8日
6 3 1 2023 年 3 月 10 日
7 4 1 2023年3月11日
8 5 1 2023年3月13日
9 5 1 2023年3月15日
10 5 1 2023年3月20日
11 1 3 2023年3月22日

我希望能够按最大发送日期选择不同的用户(按用户分组)顺序。

所以,有了上面的数据,结果应该如下。

id 用户ID 用户 ID 发送日期
11 1 3 2023年3月22日
10 5 1 2023年3月20日
7 4 1 2023年3月11日
5 2 1 2023年3月8日

我需要使用 Laravel Eloquent,因为这样我可以使用 with('user', 'user_to') 来一起选择用户数据。

请帮忙。

php laravel query-builder
1个回答
0
投票

您可以使用 Eloquent 的

groupBy
orderBy
with
方法。将
send_date
转换为 MySQL 可以理解的日期格式。您可以通过将
send_date
添加到模型的
$dates
属性来完成此操作。

protected $dates = ['send_date'];

然后,使用

DB::raw
函数为每个
send_date
选择最大
user_id
。然后,您可以按
user_id
分组并按最大
send_date
排序。

use Illuminate\Support\Facades\DB;

$chats = Chat::select(DB::raw('max(id) as id, user_id, user_id_to, max(send_date) as send_date'))
    ->groupBy('user_id')
    ->orderBy('send_date', 'desc')
    ->with('user', 'user_to')
    ->get();

此查询将返回每个用户的最新聊天记录,而不是每对用户的最新聊天记录。如果您想获取每对用户的最新聊天记录,您应该按

user_id
user_id_to
进行分组。

© www.soinside.com 2019 - 2024. All rights reserved.