Laravel如何按积分获取当前用户排名?

Posted

技术标签:

【中文标题】Laravel如何按积分获取当前用户排名?【英文标题】:Laravel how to get current user rank by points? 【发布时间】:2021-08-12 03:41:15 【问题描述】:

我需要按点获取当前用户排名。例子。我按以下方式计算所有用户总数:

$userCount = User::count();

我有带有点列的用户表。 USERS 表:

USER ID | USERNAME | POINTS
1         USERA       32.25
2         USERB       2.25
3         USERC       -12.25

我需要根据他的分数来获得选定的用户排名。

更新: 我的刀片显示用户个人资料:

        public function show($slug)
    
        /** @var User $user */
        $user = User::whereSlug($slug)->firstOrFail();
        if (! $user->isActivated()) 
            $this->alertInfo(trans('app.access_denied'));
            return;
        
        $user->access_counter++;
        $user->save();
        $this->title("Player $user->username profile");
        $this->pageView('users::show', compact('user'));
    

路线文件:

ModuleRoute::context('Users');
    
ModuleRoute::resource('users', 'UsersController', ['only' => ['index', 'show', 'edit', 'update']]);
ModuleRoute::get('players/slug', 'UsersController@show')->name('users.show');

【问题讨论】:

【参考方案1】:

您必须使用简单的 SQL 查询,在本例中为 Eloquent

$user = User::max('points');

这应该返回最高点的user。 Documentation

【讨论】:

感谢您的回复。但我需要获得 USER 排名,而不是拥有 MAX 点的用户名。 你能定义它,因为它不清楚吗? User rank 是什么意思?您将收到 User 回复... 感谢您的回复。我需要按点取出选定的用户排名。示例:USER1 有 1000 点,USER2 有 100 点。所以 USER2 排名是#2。所以我需要去掉排名位置:'#2' :) 那么,有人选择了“用户 10”,你想显示它是什么排名?【参考方案2】:

如果要返回当前已验证的User的位置,可以执行以下操作:

// get all users and order them by the `points` field in descending order
$usersByPoints = User::orderBy('points', 'desc')->get();

// search through your users to find the record where
// the name of the user record matches that of the autneticated user
$position = $usersByPoints->search(function ($user, $key) 
    return $user->name == auth()->user()->name;
);

// add 1 to the poisition as it will be zero indexed
return $position + 1;

更新

根据您的评论,让我们在web.php 中定义一个路由:

Route::get('/user', UserProfileController::class);

使用 artisan 在您的 app/Http/Controllers 目录中创建 UserProfileController(如果您愿意,也可以手动创建):

php artisan make:controller UserProfileController

在此控制器内部,定义一个名为 __invoke() 的函数,当有人访问 /user 路由并添加上面的代码时,Laravel 将调用该函数:

public function __invoke()

    $usersByPoints = User::orderBy('points', 'desc')->get();

    $position = $usersByPoints->search(function ($user, $key) 
        return $user->name == auth()->user()->name;
    );

    return view('user.profile', ['position' => $position + 1]);

在上面return view() 指定当有人访问/user 路由并将position 属性传递给视图时要呈现的刀片视图。

resources/views/user/profile.blade.php 创建刀片视图。然后您可以按如下方式访问$position 属性:

Your position is  $position !

更新 2 - 在数据库上进行

mysql 没有像其他数据库引擎那样的row number 函数的概念,但是,对于那些关心的人,可以使用 PHP 在数据库而不是内存中执行上述查询:

$position = (int) (DB::select(
    'select (@row_number:=@row_number + 1) as `position` from users, (select @row_number:=0) as t where id = ? order by points desc',
    [auth()->user()->id]
)[0])->position;

return $position + 1;

【讨论】:

感谢您的回答。我如何在刀片上使用它?创建公共功能?我是 laravel 的新手,再次感谢您的回答! @Erikas 我已经为你更新了我的答案。 还是什么都没有。我用刀片更新了我的第一篇文章。 我不建议您在搜索集合时使用search,让数据库执行此操作,因为与数据库相比,PHP 会非常慢,当您可以使用简单的查询来执行此操作时那个。 @Erikas 您没有将功能放入刀片文件中,请再次阅读我的答案。如果没有意义,我建议您阅读basics of Laravel。

以上是关于Laravel如何按积分获取当前用户排名?的主要内容,如果未能解决你的问题,请参考以下文章

使用Redis实现积分排行榜,并支持同积分按时间排序

使用Redis实现积分排行榜,并支持同积分按时间排序

使用Redis实现积分排行榜,并支持同积分按时间排序

对表格进行数字排序并获取列表编号

Laravel:具有多对多关系的历史排名系统

使用 MySQL 获取用户排名