【问题标题】:Laravel how to get current user rank by points?Laravel如何按积分获取当前用户排名?
【发布时间】: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');

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

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

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

    这应该返回最高点的userDocumentation

    【讨论】:

    • 感谢您的回复。但我需要获得 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
    猜你喜欢
    • 1970-01-01
    • 2013-04-26
    • 2014-08-21
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 2015-09-06
    • 2013-05-03
    相关资源
    最近更新 更多