Laravel在数据库中排序并保存位置

时间:2018-07-29 12:35:11

标签: php laravel eloquent

我的数据库中有一个名为“用户”的表,它具有以下列: idpointsrank

每次我更新分数时,我都希望按分数desc对所有用户进行排序,并将排名位置保存在该列中。

我想知道如何从数据库中获取所有行,使用收集方法对它们进行排序,并使用update来更新rank列。但是我想知道一个十万个用户一个一更新的力度有多大。

也许有经验的Laravel开发人员可以在这种情况下为我提供最佳解决方案?

2 个答案:

答案 0 :(得分:0)

如果要按points排序数据,可以使用

$user = User::orderBy('point', 'desc')
        ->get();

答案 1 :(得分:0)

好的,这里需要的是Eloquent Observer,因此每次更新update上的点时,它将按点desc对所有用户进行排序并保存排名位置。

但是,由于有大量数据,我将永远不会使用集合或类似的东西,因为那样会很慢,我建议您使用原始方法来做到这一点。

如果在这种情况下延迟很重要,那么现在有两个可能的选择,那么您可以将所有逻辑放在观察器本身中,如下所示:

首先将观察者逻辑分离到另一个类,例如:

namespace App\Observers;

class UserRankObserver
{
    public function updated($model)
    {
       //check if points column its updated 
       //if yes then run the query to sort all user by points and save rank 
    }
}

然后在您的User模型上,您需要像这样注册观察者:

public static function boot()
{
    parent::boot();
    User::observe(new \App\Observers\UserRankObserver);
}

情况二,当延迟无关紧要时,那么我建议在方法updated上将数据传递给后台作业,以完成以下操作:     命名空间App \ Observers;

class UserRankObserver
{
    public function updated($model)
    {
       //check if points column its updated 
       //if yes then pass the data to a background job to complete the task.
       (new UpdateUserRankJob($data))->dispatch();
    }
}