我正在为客户项目的一部分创建一个私人消息系统。
我将每条消息存储为记录,其中from
的值为发件人的ID,to
为接收者的ID,message
为消息文本。
我希望有一个页面,用户可以在其中查看他们拥有消息传递线程的其他用户的列表。我正在检索用户是发件人或收件人的所有相关邮件:
$thisProfile = Auth::user()->profile_id;
$messages = DB::table('messages')
->where('from', '=', $thisProfile)
->orWhere('to', '=', $thisProfile)
->get();
return view('messages.all', compact('messages'));
然而,这显然是返回提及相同两个用户的记录。以下是我以用户1登录时获得的一些示例记录:
#1 - from: 1, to: 2
#2 - from: 2, to: 1
#3 - from: 1, to: 2
#4 - from: 4, to: 1
#5 - from: 1, to: 4
#6 - from: 9, to: 1
我想过滤掉以前检索过相同两个用户的记录。在这种情况下,结果应如下所示:
#1 - from: 1, to: 2
#4 - from: 4, to: 1
#6 - from: 9, to: 1
我最接近的是找到与集合一起使用的unique()
方法,它会在一个订单中过滤掉to
或from
的记录。
如何基于两个键to
和from
过滤掉记录,它们是可互换的顺序?
答案 0 :(得分:0)
我认为我终于理解了你的目标,这就是我建议你做的事情。
期望您对messagesFrom
(用户发送的)和messagesTo
(他们收到的)有单独的关系,您应该可以使用此查询:
$thisProfile = Auth::user()->profile_id;
$users = User::whereHas('messagesFrom', function ($messages) use ($thisProfile) {
$messages->where('to', $thisProfile);
})
->orWhereHas('messagesTo', function ($messages) use ($thisProfile) {
$messages->where('from', $thisProfile);
})
->get();
加载最新的Message
对话以进行预览也可能是一件很好的事情,但这听起来像是对另一个问题就足够了。