一个用户和和多其他用户有私信来往,怎样在显示私信列表时按联系人分组显示
我现在有这样一个需求,这个网站有多个用户,用户之间可以相互发私信。当用户进入自己的私信列表页面时,列表是按联系人的分组显示的。并且在列表上显示他俩之间最后一条回复信息。
现在私信表有 from_user_id 字段(发信人的用户 id), to_user_id(收信人的用户 id),content字段(私信内容)。我试过这样的方式查询。
$id = Auth::id(); //我的用户id
//Message 是私信模型
Message::where('from_user_id', $id)->orWhere('to_user_id', $id)->groupBy('from_user_id','to_user_id')->get()
但是返回的结果不是我想要的。因为里面包含同一个用户发给的信息。比方说我的用户 id 是 10, 我给 id 为 20 的用户发过信息,他也给我回复过,查询结果里面就会有两条(一条是我发给他的, 另一条是他发给我的)。但是我想让这两条分在一组里。不知道该怎么办?我想尝试在表里新增一个字段,比如叫 group。然后每次插入数据时,根据两个用户的 id 排序, 例如 我的 id 是 10,对方 id 是 20 ,然后把这个字段的值设为 10-20 .多方给我回复时,也把这个字段的值设为 10-20。这样查询时按 这个 group 字段分组。不知道这样是不是很 low?
表结构供你参考:
id
int(10) unsigned NOT NULL AUTO_INCREMENT,body
text COLLATE utf8mb4_unicode_ci NOT NULL,created_at
timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',deleted_at
timestamp NULL DEFAULT NULL,sender_id
int(10) unsigned NOT NULL COMMENT '发送者',recipient_id
int(10) unsigned NOT NULL COMMENT '接收者',recipient_last_read
timestamp NULL DEFAULT NULL COMMENT '接受者最后阅读的时间,不为空就是已读',conversation
varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '对话标识符,两个用户的 id 正序加下划线',数据库设计,应该是读取越简单越好,因为读取比写入要频繁。所以不推荐
groupBy('from_user_id','to_user_id')
这种方式