我有一个排行榜leaderboard_scores表。

Leaderboard_scores具有以下列: idLeaderboard_idplayer_idscore

排行榜模型中,我与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楼 票数:1 已采纳

这里有一些想法

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

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

  • 如果您仍然希望每次都进行计算,则可以使用比原始循环更优化的mysql rank函数

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

  ask by Richard Fu translate from so

未解决问题?本站智能推荐:

1回复

Laravel组合有()和whereHas()

我试图在Eloquent中结合一些方法,但似乎无法正确地将它们组合在一起。 我有一个查询,它提取hasMany计数为0的所有项目。 所以基本上我想知道关系在哪里“空”。 在这种情况下,我有一个带音频样本的项目。 所以,我想获得没有音频样本的项目。 这完全没问题。 但是我还想添加一
1回复

如何为Laravel5提供多层hasMany()关系?

假设我有以下表格: 在Laravel 5中,如果我想获得订单的所有菜肴,我可以这样做: 有没有办法可以在一行中获得订单所需的所有原料?
2回复

尝试在达到父级属性时获取非对象的属性

我试图在网上获取非对象错误的属性: <span>{{$item->subcats->name}}</span> 。 如何获得产品子类别的名称? 我的产品型号:
1回复

Laravel集合变量null返回

我有一个DB表名是产品。 当我查询(雄辩)到该表时,返回包含所有字段的集合对象。 但我每次访问banner_image 字段都返回一个空值。 但我可以访问该集合中的其他变量工作正常。 如果我定义了一个访问器,问题就解决了。 我想知道,只有一个变量有什么问题。 DD到雄辩的收藏 当我$innerPr
1回复

Laravel在视图中迭代集合

我正在尝试为学生迭代一系列课程,需要帮助确保课程的显示按需要的方式呈现。 对于当天的第一堂课,如果是当天的最后一堂课,则需要说“头等舱”,如果介于两者之间,则需要说“最后一堂课”,则需要说 #x 级,其中 x 代表属性中的类的编号。 我想知道这是不是我可以在集合中使用例如 first() 和 las
1回复

Laravel-过滤和分组不同类型的集合

我有两种不同类型的收藏。 第一个集合是在不使用Eloquent的情况下转换为集合的数组。 其次是SuperProduct Collection。 这两个集合使用合并合并在一起。 有没有办法将这两个不同的集合与type分组? 也许有更好的解决方案?
1回复

联合一个缺少值laravel的集合

我试图将缺少值添加到一个集合,导致我的数据库表包含多个项目。 我想尝试的是将集合中缺少的项添加为union值。 我使用了联盟,但它不起作用,它制作了一个拼写阵列 我不想要单独的数组和重复项目。
2回复

在Laravel中将数组转换为集合

我在PHP中有以下数组: 现在,我想将其转换为集合,以便按website或url的键排序。 但是,当我这样做时: 我得到这个代替: 而且排序不起作用,我想知道我在做错什么以及如何解决它,因此我有了一个可以轻松排序的对象的数组集合。 编辑:我希望输出与此相同: “分类不起作用”是指未对项目进行分类。