Чтобы получить первый ранг, вы можете сделать это с помощью Eloquent:
$users = User::orderBy('score', 'DESC')->limit(10)->get();
$currentUser = Auth::user();
$currentUserId = $currentUser->id;
if (!$users->contains('id', $currentUserId)) {
$users->push($currentUser);
}
Так как $users
будет упорядочено по счету, если текущий пользователь не существует в первой десятке, то у него естьхудший результат, чем последний в списке, поэтому имеет смысл добавить его в конец.
Для второго ранга:
$idsFilter = [1, 2, 3, 4, 5];
$users = User::whereIn('id', $idsFilter)->orderBy('score', 'DESC')->limit(count($idsFilter))->get();
$currentUser = Auth::user();
$currentUserId = $currentUser->id;
if (!$users->contains('id', $currentUserId)) {
$users->push($currentUser);
}
return $users;
Поскольку вы хотите фиксированный список идентификаторов дляранга, имеет смысл показывать идентификаторы и добавлять текущего пользователя, если он не входит в топ X идентификаторов, которые вы просили.
Чтобы получить позицию пользователя в ранге А, вы можете сделатьметод в модели User
, такой как:
public function getPosition()
{
return DB::raw("SELECT COUNT(*) + 1
FROM users
WHERE score > {$this->score}");
}
и добавление фильтра по идентификаторам для ранга B с тем же процессом.