首页 文章

Laravel按最后一条消息订购对话

提问于
浏览
1

我有一个 Conversation 型号,有很多 ConversationMessage 型号 .

现在我想根据对话的最后一条消息来订购对话 . 基本上像whatsapp . 如何构建查询?

作为我的代码的旁注:Conversation包含一个用户( user_id )和一个关联的公司( company_id ) . 公司与用户有 belongsToMany 关系 .

Conversation::whereHas('company', function ($q) use ($userId) {
    $q->whereHas('users', function ($q1) use ($userId) {
        $q1->where('users.id', $userId);
    });
})->orWhereHas('user', function($q) use ($userId) {
    $q->where('user.id', $userId);
})->with(array('conversationMessage' => function($q) {
    $q->orderBy('created_at', 'DESC');
})->get();

这命令 ConversationMessage 关系模型,但不是对话 . 如何根据最后一条消息订购 Conversations

1 回答

  • 1

    您可以将 timestamp 字段(如 last_message_at )添加到 Conversations 模型中,并且当新的消息添加到该字段的 Conversation 更新时,稍后您可以根据 last_message_at 对结果进行排序 .

    或者您可以在下面的查询中过滤结果(测试它是否有效):

    Conversation::whereHas('company', function ($q) use ($userId) {
            $q->whereHas('users', function ($q1) use ($userId) {
                $q1->where('users.id', $userId);
            });
        })->orWhereHas('user', function($q) use ($userId) {
            $q->where('user.id', $userId);
        })->with(array('conversationMessage' => function($q) {
            $q->orderBy('created_at', 'DESC');
        })
        ->selectRaw("conversations.*, (SELECT MAX(created_at) from conversation_messages WHERE conversation_messages.conversation_id=conversations.id) as latest_message_on")
        ->orderBy("latest_message_on", "DESC")
        ->get();
    

相关问题