我有一个排行榜和 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循环似乎不是一个好选择。
我应该使用原始数据库查询吗?或者更好的主意?
答案 0 :(得分:1)
这里有一些想法
检查缓存: https://laravel.com/docs/5.4/redis
Mysql Rank:http://www.folkstalk.com/2013/03/grouped-rank-function-mysql-sql-query.html