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

Laravel中按关联表击杀数排序并分页查询用户数据

实现方案及优化建议

1. 定义模型关联

在SteamUsers模型中添加与Deaths模型的一对多关联(需将steam_user_id替换为你dblog_deaths表中实际关联用户的外键字段名):

// app/Models/SteamUsers.php
public function deaths()
{
    return $this->hasMany(Deaths::class, 'steam_user_id');
}

2. 修改Controller逻辑实现需求

通过withCount()统计每个用户的击杀数,按击杀数降序排序后使用paginate()完成分页:

public function informations()
{
    // 按击杀数降序分页获取用户,默认每页15条,可自行调整参数
    $users = SteamUsers::withCount('deaths')
        ->orderBy('deaths_count', 'desc')
        ->paginate(15);

    // 优化其他模型数据查询:避免一次性拉取全量数据,同样使用分页或按需筛选
    $wounds = Wounds::latest()->paginate(15);
    $deaths = Deaths::latest()->paginate(15);
    $revives = Revives::latest()->paginate(15);

    // 用compact更清晰地返回数据
    return compact('users', 'wounds', 'deaths', 'revives');
}

3. 更优方案推荐

  • 数据库索引优化:给dblog_deaths表的外键字段(如steam_user_id)添加索引,大幅提升关联统计的查询速度
  • 缓存统计数据:如果击杀数不需要实时更新,可通过Laravel缓存功能缓存withCount的结果,减轻数据库负载,示例:
    $users = Cache::remember('ranked_users', 3600, function () {
        return SteamUsers::withCount('deaths')
            ->orderBy('deaths_count', 'desc')
            ->paginate(15);
    });
    
  • API资源规范返回:使用Laravel的API资源(Resource)统一数据返回格式,方便前端处理,同时可灵活控制返回字段
  • 按需查询数据:如果前端不需要所有模型的全量数据,只返回当前需要的部分,避免不必要的数据库查询

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 05:06:07