我想创建一个聊天系统,我可以在上面列出特定 2 个人之间的所有聊天
我有 2 个表 users
和 chats
我的聊天表有 3 列 - user_id
、friend_id
和 chat
我的User.php
模型文件是这样的
public function chats() {
return $this->hasMany('App\Chat');
}
例如:
我想在不改变对话顺序的情况下列出用户1和3之间的所有聊天
我可以通过 $chats = Auth::user()->chats->where('friend_id', '=', $id);
来简单地做到这一点,但这只会给经过身份验证的 (这是用户 1 或 3) 用户聊天。但我想要他们两个之间的对话。
所以我找到了另一种方法来做到这一点
$first = Chat::all()->where('user_id', '=', Auth::user()->id)->where('friend_id', '=', $id);
$second = Chat::all()->where('user_id', '=', $id)->where('friend_id', '=', Auth::user()->id);
$chats = $first->merge($second);
但是这种方式存在一些问题。这不会以正确的顺序进行聊天。我认为不可能正确排序。
所以我的问题是如何轻松地按正确顺序列出两个人之间的对话?
如果您想了解有关我的问题的更多详细信息,可以直接询问。
最佳答案
您应该能够在一个带有参数分组的查询中执行此操作,而不是执行两个单独的查询然后合并它们。
Chat::where(function ($query) use ($id) {
$query->where('user_id', '=', Auth::user()->id)
->where('friend_id', '=', $id);
})->orWhere(function ($query) use ($id) {
$query->where('user_id', '=', $id)
->where('friend_id', '=', Auth::user()->id);
})->get();
这可能也会以正确的顺序返回您的结果,只是因为没有指定任何排序标准,数据库通常会按照插入的顺序返回行。但是,如果不向您的聊天表添加排序依据(时间戳或自动增量 ID),则无法保证这一点。
关于php - 按正确顺序列出 2 个用户之间的对话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46892601/