Pat*_*cke 2 php sql laravel eloquent
我有一个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();
Run Code Online (Sandbox Code Playgroud)
这对ConversationMessage关系模型进行了排序,但对对话进行了排序。如何Conversations根据最后一条消息进行排序?
您可以向您的模型添加一个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();
Run Code Online (Sandbox Code Playgroud)