我有一个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
进行排序?
答案 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();