You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:38:51