在Laravel中更新或获得玩家等级的最佳做法

时间:2016-11-04 12:38:25

标签: php mysql laravel

我已经开始了一个多个联盟中有多个玩家的项目。他们获得积分,最后有一个排名表,显示得分最多的玩家。

到目前为止一切顺利,但我在正确获得球员排名方面遇到了问题。

竞争对手我喜欢这样,因为竞争对手可以是球队或球员(当然球队或球员是每个联赛,而不是两个联盟):

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

0 个答案:

没有答案