一个用户和和多其他用户有私信来往,怎样在显示私信列表时按联系人分组显示

我现在有这样一个需求,这个网站有多个用户,用户之间可以相互发私信。当用户进入自己的私信列表页面时,列表是按联系人的分组显示的。并且在列表上显示他俩之间最后一条回复信息。
现在私信表有 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?

龙小默
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
Summer
最佳答案

表结构供你参考:

  • 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') 这种方式

4年前 评论
puzzle9 3年前
讨论数量: 3
Summer

表结构供你参考:

  • 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') 这种方式

4年前 评论
puzzle9 3年前
Summer

表结构供你参考:

  • 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') 这种方式

4年前 评论
puzzle9 3年前

谢谢Summer 解决了我的问题 :kissing_heart:

4年前 评论
Summer 4年前

那么一个用户和多个用户私信往来,如何列出和每个用户最后一条私信并分页呢?去重问题。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!