我正在使用Laravel开发一个聊天应用程序,我需要正确排序消息的帮助。
我当前的实现可以工作,但它检索当前用户发送给任何人的所有消息,以及任何人发送给当前用户的消息。
我希望它只检索当前用户和他们正在聊天的用户之间的消息。
我有两个消息表:存储发送者和接收者ID的聊天,以及存储消息内容的消息。表格结构请参见随附图片。
我已经包含了一些代码片段来显示用户、聊天和消息模型之间的关系。
有人能帮我解决这个问题吗?
用户型号
public function chats()
{
return $this->hasMany(Chat::class, 'recipient_id')
->orWhere(function($query) {
$query->where('sender_id', '<>', $this->id)
->where('recipient_id', $this->id);
})
->orWhere(function($query) {
$query->where('sender_id', $this->id)
->where('recipient_id', '<>', $this->id);
})->orderBy('created_at', 'asc');
}
聊天模式
public function users()
{
return $this->belongsTo(User::class);
}
public function messages()
{
return $this->hasMany(Message::class, 'chat_id');
}
消息模型
public function chats()
{
return $this->belongsTo(Chat::class, 'chat_id');
}
消息控制器
public function getMessages($username) {
$host = User::where('username', $username)->first();
$user = Auth::user();
if($username !== $user->username && !Abilities::isBlocked($username) && Abilities::canBlock($username)) {
$messages = $host->chats()
->with(['messages' => function ($query) {
$query->orderBy('created_at', 'desc');
}])
->where('recipient_id', $user->id)
->get()
->each(function($chat) {
$chat->status = $chat->sender_id === Auth::user()->id ? "sent" : "received";
});
return response()->json([
"messages" => $messages,
]);
}
return response()->json(["messages" => "Unauthorized access."]);
}
表格结构
1条答案
按热度按时间1hdlvixo1#
假设你的关系都是正确的设置,这应该让你所有给定用户之间的聊天。(假设两个用户可以进行 * 多次 * 聊天。如果不是,则只返回第一个
Chat
模型。叫喜欢