Laravel获得集合中

时间:2017-08-16 01:09:44

标签: laravel laravel-5 collections has-many ranking

我有一个排行榜 leaderboard_scores 表。

leaderboard_scores 包含以下列: id leaderboard_id player_id 得分

排行榜模型中,我与 LeaderboardScore 定义了 hasMany 关系:

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

现在我希望获得特定排行榜中玩家的排名。

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

$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 个答案:

答案 0 :(得分:1)

这里有一些想法

  • 不是每次获得请求时计算排名,而是遍历所有数据。你可以将玩家等级存储在数据库或缓存中。您只需在添加/删除新玩家或改变分数时计算它们。

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

  • 如果你仍然想在每次使用mysql rank函数时计算它,它比原始循环更优化

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