我有一个Conversation模型,其中有很多ConversationMessage模型。
Conversation
ConversationMessage
现在,我想根据对话的最后一条消息对对话进行排序。基本上就像WhatsApp。如何建立查询?
作为我的代码的注释:对话包含一个用户(user_id)和一个与公司相关的(company_id)。公司belongsToMany与用户有关系。
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根据上一条消息对进行排序?
Conversations
您可以在模型中添加一个timestamp字段,然后在向该字段添加新消息时对该字段进行更新,然后您可以根据对结果进行排序。last_message_at``Conversations``Conversation``last_message_at
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();