代码之家  ›  专栏  ›  技术社区  ›  Richard Fu

Laravel获取集合中一行的位置/秩

  •  0
  • Richard Fu  · 技术社区  · 7 年前

    排行榜 桌子

    排行榜得分 包含列: 身份证件 , 排行榜id , , 分数

    排行榜 有很多 排行榜得分

    public function scores()
    {
        return $this->hasMany('App\LeaderboardScore')->orderBy('score', 'desc');
    }
    

    现在我想得到一个球员在某个排行榜上的排名。

    所以在控制器中,我做了一个循环来找到给定的位置 :

    $score = $leaderboard->scores;
    
    $scoreCount = $scores->count();
    $myScore = $scores->where('player_id', $request->query('player_id'));
    
    if ($myScore) { // If got my score
        $myRank = 1;
        for ($i = 0; $i < $scoreCount; $i++) {
            if ($scores[$i]->player_id == $request->query('player_id')) {
                $myRank = $i + 1;
                break;
            }
        }
        // Output or do something with $myRank
    }
    

    它工作得很好,但我担心的是性能,当我有十万名球员,他们不断地得到他们的排名。for循环似乎不是一个好的选择。

    我应该使用原始数据库查询吗?还有更好的主意吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Anar Bayramov    7 年前

    这里有一些想法

    • 不要每次收到请求时都计算秩,而是遍历所有数据。你可以只在数据库或缓存中存储玩家排名。你只需要在新玩家添加/删除或分数更改时计算它们。

    检查缓存: https://laravel.com/docs/5.4/redis

    Mysql排名: http://www.folkstalk.com/2013/03/grouped-rank-function-mysql-sql-query.html