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如何按积分获取当前用户排名?的主要内容,如果未能解决你的问题,请参考以下文章