Laravel按最新消息对对话进行排序

时间:2018-12-09 10:54:37

标签: php sql laravel eloquent

我有一个Conversation模型,其中有许多ConversationMessage模型。

现在,我想根据对话的最后一条消息对对话进行排序。基本上就像WhatsApp。如何建立查询?

作为我的代码的旁注:对话包含一个用户(user_id) 和关联的公司({{1)}。公司与用户具有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进行排序?

1 个答案:

答案 0 :(得分: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();