Php Laravel为聊天应用程序加载已读和未读消息

Php Laravel为聊天应用程序加载已读和未读消息,php,laravel,vue.js,Php,Laravel,Vue.js,我正在使用Laravel和Vue开发聊天应用程序 聊天室打开时,页面向下滚动至页面底部,显示最近50条消息 我有一个模型message和message\u通知和message\u通知为组中的每个用户都有一行,并且是可见的标志。这就是我可以通过用户获取未读消息的方式 消息表包含以下字段 id| body | conversation_id | user_id id | message_id | conversation_id | user_id | is_seen MessageNotifi

我正在使用Laravel和Vue开发聊天应用程序

聊天室打开时,页面向下滚动至页面底部,显示最近50条消息

我有一个模型
message
message\u通知
message\u通知
为组中的每个用户都有一行,并且
是可见的
标志。这就是我可以通过用户获取未读消息的方式

消息
表包含以下字段

id| body | conversation_id | user_id
id | message_id | conversation_id | user_id | is_seen 
MessageNotification
表包含以下字段

id| body | conversation_id | user_id
id | message_id | conversation_id | user_id | is_seen 
我已经使用
paginator
实现了无限顶层加载。因此,当用户到达滚动条顶部时,
limit 25 offset 0
变为
limit 25 offset 25
,依此类推

现在,我正在尝试实现任何常见的聊天应用程序功能,当用户打开聊天组对话时,加载所有未读消息并加载未读消息之前的最后n条消息

因此,我有一个方法来
getMessages
,它返回paginator集合,忽略
is\u seen
标志

select `message_notification`.`id` as `notification_id`,
       `messages`.*
from `messages`
    inner join `message_notification`
        on `message_notification`.`message_id` = `messages`.`id`
where `messages`.`conversation_id` = 406
  and `message_notification`.`user_id` = 4
  order by mc_messages.id desc
  limit 25 offset 0
现在,我如何加载对话中的所有未读消息以及25条最新已读消息

我试图合并2个集合,但其中一个集合将带有分页,而另一个没有分页,因此无法正常工作

如果我将2个集合发送到
vue
并将其合并到
vue
端,分页将变得无用,因为我会将所有未读消息标记为已读
已装入
,因此下次启动查询时,
limit 25 offset 25
将给出一些相同的数据


我如何解决这个问题?

Hi@mikeros你在使用关系吗。如果您实现了这些功能,您可以使用larvel模型函数,如Messages::whereIsSeen(true)->limit(20)@我的问题不是将它们标记为已读。它将未读邮件与已读邮件和无限顶部滚动加载合并。我将在一个集合中获取25条已读邮件,然后在另一个查询中获取未读邮件,然后像在laravel文档中那样合并集合,或者我将它们作为2个参数提供给vue,而不是1个,这甚至可能会给您更多的控制,你有可能这样做吗?@amirkamizi是的,我试过了,问题是分页。当用户打开聊天室时,所有未读消息都标记为已读,因此当滚动到顶部并加载下一组25条消息时,结果集会发生变化。@Mikeros哦,我明白了,然后我发现在您的查询中,您已按message.id排序。但在我看来,您应该在db“updated_at”中添加另一列,这样当您收到阅读消息时,可以按updated_at而不是id对其进行排序。当看到状态更改时,updated_at也会更改。对于分页,因为您不希望这些未读消息被加载两次,您可以A:将未读更改为在后台读取并重新加载数据(全部为现在读取),或B:将最近更改的已读消息的计数发送到后端,以便按顺序偏移+计数并更新_。你怎么认为?