我正在使用Laravel,这可能是我的用户表:
id|score
1|10
2|13
3|15
4|7
5|11
用户可以看到具有两个等级的页面:等级A和等级B。
排名A
按分数排名的前10位用户,有两种可能的情况:看到此排名的用户是否在前10位用户中。
前10位用户:获取10位用户列表
不在前10名中的用户:获取11名用户的列表(前10名以上的当前用户在所有用户中排名)
RANK B
给定ID组中按分数排序的前10个用户(有时可能是1,有时是10,有时是0),这两种情况相同:该用户是否在前10名中。
前10位用户:获取10位用户列表
不在前10名中的用户:获取11名用户的列表(前10名+当前用户在ID组中的位置)
有什么办法可以用Eloquent吗?否则我该如何在MySql中做到这一点?
答案 0 :(得分:1)
要获得第一名,您可以使用Eloquent:
$users = User::orderBy('score', 'DESC')->limit(10)->get();
$currentUser = Auth::user();
$currentUserId = $currentUser->id;
if (!$users->contains('id', $currentUserId)) {
$users->push($currentUser);
}
由于$users
将按得分排序,因此如果当前用户不在前10名中,那么他的得分比列表中的最后一位差,因此将其添加到末尾是很有意义的
第二名:
$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;
由于您希望对ID进行固定排序,因此只有在显示ID并添加当前用户(如果该用户不属于您要求的前X个ID)时才有意义。
要获取用户在等级A中的位置,您可以在User
模型上执行以下方法:
public function getPosition()
{
return DB::raw("SELECT COUNT(*) + 1
FROM users
WHERE score > {$this->score}");
}
并通过相同的步骤在排名B的ID上添加一个过滤器。