我有下表。我实际上正在设计一个简单的聊天,所以,我们有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') 来一起选择用户数据。
请帮忙。
您可以使用 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
进行分组。