【发布时间】:2021-12-06 22:53:07
【问题描述】:
我有一对一的聊天简单表,其中消息存储从用户 ID 到用户 ID。这是架构。
我通过将 from_user_id 匹配与登录用户或 to_user_id 匹配来检索两个用户之间的对话
->where(function($q) use($user_id) {
$q->where('from_user_id', $user_id)
->orWhere('to_user_id', $user_id);
})
现在我想要登录用户和其他用户之间的独特对话。我试过了
->groupBy('from_user_id', 'to_user_id')
但它同时返回记录 ID:1 和 6,因为它存储为 65 - 66 和 66 - 65。
因此,我可以通过独特的对话进行分组并仅获得一条记录。或者我需要将表的架构更改为会话和会话消息。
请指导我。 谢谢。
【问题讨论】:
-
您可以按原始表达式进行分组,例如(调整语法)
->groupBy(db::RAW('LEAST(from_user_id,to_user_id), GREATEST(from_user_id,to_user_id)'))。 -
@Akina 非常感谢。它给出了唯一的记录,但是从那个重复的记录 order by 不起作用,是否可以从相同的记录中获取最新记录?
-
使用显示的分组获得组的最大日期时间。使用它作为子查询从另一个表副本中选择相应的行。这在纯 SQL 中很简单——但我不使用 Laravel,因此我不知道它会是什么样子(也许 Laravel 有一些特殊的工具来简化这个常见任务)。
标签: php mysql laravel database-design laravel-8