如何在Laravel中以正确的顺序发送和接收消息?

ffscu2ro  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(144)

我正在使用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."]);
}

表格结构

1hdlvixo

1hdlvixo1#

假设你的关系都是正确的设置,这应该让你所有给定用户之间的聊天。(假设两个用户可以进行 * 多次 * 聊天。如果不是,则只返回第一个Chat模型。

public function getDiscussionWith(int $userOneId, int $userTwoId): Collection
{
    return Chat::query()
        ->with('messages')
        // messages where One is the sender and Two is the receiver
        ->where(function(EloquentBuilder $query) use ($userOneId, $userTwoId){
            $query->where('sender_id', $userOneId)
                ->where('receiver_id', $userTwoId);
        })
        // or where One is the receiver and Two is the sender
        ->orWhere(function(EloquentBuilder $query) use ($userOneId, $userTwoId){
            $query->where('sender_id', $userTwoId)
                ->where('receiver_id', $userOneId);
        })
        ->get();
}

叫喜欢

$discussions = $chatRepository->getDiscussionsWith($user->id, $host->id);

foreach($discussions as $discussion){
    $messages = $discussion->messages->orderBy('created_at', 'desc');
}

相关问题