2017-08-16 154 views
0

我有一個排行榜排行榜分數表。Laravel獲得集合中排名/排名

leaderboard_scores有列:IDleaderboard_idplayer_id得分

排行榜模型,我定義了一個的hasMany關係與LeaderboardScore

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循環似乎不是一個好的選擇。

我應該使用原始數據庫查詢嗎?或者有更好的主意?相反,每次你的請求,然後遍歷所有的數據時間計算行列

回答