我已经开始了一个多个联盟中有多个玩家的项目。他们获得积分,最后有一个排名表,显示得分最多的玩家。
到目前为止一切顺利,但我在正确获得球员排名方面遇到了问题。
竞争对手我喜欢这样,因为竞争对手可以是球队或球员(当然球队或球员是每个联赛,而不是两个联盟):
return $this->belongsToMany('App\User', 'competitors', 'league_id', 'competitors_id')
->where('competitors.competitors_type', 'App\User')
->withPivot('id', 'points', 'wins', 'lose', 'score', 'enemy_score')->withTimestamps();
我尝试将以下方法添加到pivot-table-model Competitor
:
public function getRankAttribute()
{
return $this->league->competitors()->where('points', '>=', $this->points)->count();
}
但是这个逻辑的问题在于,我想为排名添加更多逻辑,例如:玩家A拥有与玩家B相同的点数。但是玩家B比玩家A更好,因为他有更多的胜利。
接下来,我尝试在多个orderBy
之后在查询中给出排名:
// $ranking is a relation or Eloquent Builder instance
// which has already got multiple orderBy() statements.
$query = null;
$baseQuery = null;
if($ranking instanceof Relation) {
$query = $ranking->getQuery();
$baseQuery = $ranking->getBaseQuery();
} else {
$query = $ranking;
$baseQuery = $ranking->getQuery();
}
// Set the rank offset
$offset = (int) $baseQuery->offset;
DB::statement(DB::raw("set @rank={$offset}"));
// Adjust SELECT clause to contain the rank
if ( ! count($baseQuery->columns)) $query->select($columns);
$query->addSelect([DB::raw('@rank:=@rank+1 as rank')]);
// Return the object again
return $ranking;
这也不起作用,因为排序是在对条目进行排名之后完成的。所以我得到越来越多的行但不是排名。在我的例子中,加入联盟的最后一名球员获得了最高排名"。
现在,我正在考虑一项计划任务,每5分钟左右更新一次。但这真的是最好的做法吗?你怎么看?我该怎么做?
我正在使用MYSQL数据库和Laravel 5.2