查找2个用户之间的对话线程,不包括群组对话

时间:2018-06-14 14:07:26

标签: php laravel laravel-5 eloquent

我有一个基本的私人消息系统,能够进行1对1的对话和小组对话。

目前,我在网站上有一个“发送消息”小部件框,用户可以在其中键入用户名,并向他们发送一条消息,从而开始“1对1”会话线程。

我需要这个小部件做的是,当发送消息时,检查两个用户之间的对话是否已经存在,如果是,则将新消息添加到现有的对话线程中。如果对话不存在,则启动一个新线程。

我的主要问题是,如何排除检查两个用户都是参与者的对话线程。

两个相关表格的摘录如下:

主题表:

  • 标题
  • 类型

thread_participants表

  • 的thread_id
  • USER_ID

线程“类型”确定线程是“单个”(1-1对话)还是“组”对话。

我的理论是搜索线程表,找到两个用户在同一个线程中的位置但是我不确定如何在我的控制器中使用eloquent来做到这一点。

希望很清楚。感谢

2 个答案:

答案 0 :(得分:0)

您可以从线程表中选择相关信息并将其加入thread_participants并将表thread_participants别名(例如new_thread_participants)并再次加入。在您的条件下,您可以指定限制器

DB::table('threads')
->select('some_columns')
->join('thread_participants', 'threads.id', '=', 'thread_participants.thread_id')
->join('thread_participants AS new_table', 'threads.id', '=', 'new_table.thread_id')
->where('threads.type', 'single')
->where('thread_participants.user_id', user_1_id)
->where('new_table.user_id', user_2_id)
->get();

这也可以帮助https://www.w3schools.com/sql/sql_alias.asp

答案 1 :(得分:0)

在Laracast论坛的帮助下,我能够想出这个:

$threadBetweenTwoUsers = Thread::whereIn('id', $userParticipant)->where('type', 'single')
->whereHas( 'participants', function($query) use ($recipient_id){ 
    $query->where('user_id', $recipient_id); // filter by other participant
})
->first();