Получить рейтинг пользователя в таблице результатов - PullRequest
0 голосов
/ 15 ноября 2018

Я использую Laravel, и это может быть моя таблица пользователя:

id|score
1|10
2|13
3|15
4|7
5|11

Пользователь может видеть страницу с двумя рангами: ранг A и ранг B.

RANK A

Первые 10 пользователей по оценке, два возможных сценария: пользователь, который видит это звание, входит в первые 10 пользователей или нет.

Пользователь в первых 10: получить список из 10 пользователей

Пользователь не в первых 10: получить список из 11 пользователей (первые 10 + текущий пользователь с позицией - это позиция всех пользователей)

RANK B

Первые 10 пользователей по оценке в данной группе идентификаторов (иногда может быть 1, иногда 10, иногда 0), те же два сценария: пользователь в первых 10 или нет.

Пользователь в первых 10: получить список из 10 пользователей

Пользователь не в первых 10: получить список из 11 пользователей (первые 10 + текущий пользователь с позицией в группе идентификаторов)

Есть ли способ сделать это с Eloquent? Иначе как я могу это сделать в MySql?

1 Ответ

0 голосов
/ 15 ноября 2018

Чтобы получить первый ранг, вы можете сделать это с помощью 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 с тем же процессом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...