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

在Laravel中如何根据发布用户的等级排序查询所有帖子

按用户等级排序帖子的Laravel查询实现

前提说明

  • Post模型已定义user belongsTo关联指向User模型
  • User模型已定义rank belongsTo关联指向Rank模型
  • 以下示例默认ranks表中代表等级高低的排序字段为level,可替换为你实际使用的字段名(如priority、grade等)

方案1:联表查询(推荐,性能最优)

直接在SQL层面关联表排序,适合所有数据量场景,查询效率最高

use App\Models\Post;

$posts = Post::query()
    // 仅查询posts表字段,避免联表后字段冲突覆盖
    ->select('posts.*')
    ->join('users', 'posts.user_id', '=', 'users.id')
    ->join('ranks', 'users.rank_id', '=', 'ranks.id')
    // 等级从高到低排序,如需升序将desc改为asc即可
    ->orderBy('ranks.level', 'desc')
    ->get();

方案2:子查询排序(无需手动写join,写法简洁)

Laravel 8+支持在orderBy中传入子查询,适合不想处理联表逻辑的场景,性能接近联表查询

use App\Models\Post;
use App\Models\Rank;

$posts = Post::query()
    ->with(['user.rank']) // 预加载关联避免N+1查询
    ->orderByDesc(
        Rank::select('level')
            ->whereColumn('id', 'users.rank_id')
            ->whereColumn('users.id', 'posts.user_id')
            ->take(1)
    )
    ->get();

注意事项

  • 建议给posts.user_id、users.rank_id、ranks.level字段添加索引,可大幅提升查询性能
  • 1000条以内的小数据量场景也可使用集合排序,写法更简单,但性能远低于SQL层面排序,不适合大数据量使用:
    $posts = Post::with('user.rank')->get()->sortByDesc(fn($post) => $post->user->rank->level);
    

内容的提问来源于stack exchange,提问作者Paul Chase

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:27:04