Laravel-Jensseger MongoDB:按关联子文档属性排序消息
按关联模型字段排序Eloquent结果
嘿,我来帮你搞定这个按关联文档属性排序的问题!针对你的场景,有两种常用的实现方式,你可以根据需求来选:
方法一:数据库层面排序(推荐大数据量场景)
直接通过关联表join的方式,在查询阶段就指定排序规则,排序逻辑在数据库完成,效率更高,尤其数据量大的时候优势明显:
$messages = Message::join('conversations', 'messages.conversation_id', '=', 'conversations._id') ->select('messages.*') // 只选择messages表字段,避免和conversations表字段冲突 ->where(...) // 保留你原有的查询条件 ->orderBy('conversations.updated_at', 'desc') // 按conversation的updated_at倒序,asc为正序 ->get();
如果担心存在没有关联conversation的消息,可以加上whereHas('conversation')过滤掉这类数据:
$messages = Message::join('conversations', 'messages.conversation_id', '=', 'conversations._id') ->select('messages.*') ->whereHas('conversation') // 仅保留有有效关联的消息 ->where(...) ->orderBy('conversations.updated_at', 'desc') ->get();
方法二:集合层面排序(适合小数据量)
如果已经拿到了包含关联的消息集合,也可以在内存中对集合进行排序,这种方式更灵活,适合数据量不大的场景:
// 先获取带关联的消息集合 $messages = Message::with(['conversation'])->where(...)->get(); // 按conversation的updated_at倒序排序,sortBy为正序 $sortedMessages = $messages->sortByDesc(function ($message) { // 处理可能的null关联,避免报错 return $message->conversation?->updated_at ?? \Carbon\Carbon::minValue(); }); // 若需要转换成数组格式,可追加以下代码 $sortedMessages = $sortedMessages->values()->all();
内容的提问来源于stack exchange,提问作者Daniel Valland
相关产品推荐
相关产品推荐

