基于可互换顺序的两个键过滤掉记录

时间:2018-04-15 14:41:09

标签: php laravel laravel-5 laravel-5.6

我正在为客户项目的一部分创建一个私人消息系统。

我将每条消息存储为记录,其中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()方法,它会在一个订单中过滤掉tofrom的记录。

如何基于两个键tofrom过滤掉记录,它们是可互换的顺序?

1 个答案:

答案 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对话以进行预览也可能是一件很好的事情,但这听起来像是对另一个问题就足够了。