首页 > 解决方案 > Laravel 按最后一条消息对对话进行排序

问题描述

我有一个Conversation有很多模型的ConversationMessage模型。

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

作为我的代码的旁注:对话包含一个用户 ( 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根据最后一条消息进行排序?

标签: phpsqllaraveleloquent

解决方案


您可以向模型添加一个timestamp字段,当有新消息添加到该字段时更新该字段,然后您可以根据.last_message_atConversationsConversationlast_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();

推荐阅读