admin

Laravel按最后一条消息对对话进行排序

sql

我有一个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根据上一条消息对进行排序?


阅读 202

收藏
2021-07-01

共1个答案

admin

您可以在模型中添加一个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();
2021-07-01