我正在尝试为我的用户提供我的Laravel hiscores分页表的排名。
这是我发现的MySQL查询。我试图把这个工作作为一个Laravel雄辩的查询。
select @i := @i + 1 ranking, t.*
from (select @i:=0) initvars, users t ORDER BY wins DESC;
我的Laravel雄辩的问题现在:
$ranking = User::orderBy('wins', 'DESC')->paginate(10);
提前致谢!
$table = (new User)->getTable();
$select = \DB::raw("@i := coalesce(@i + 1, 1) ranking, {$table}.*")
$users = User::select($select)->orderByDesc('wins')->paginate(5);
在上面,您需要再次选择table.*
,因为即使您使用addSelect
而不是select
eloquent也会丢失原始列选择。我不确定这是一个错误或预期的行为,但我会调查。
澄清,如果你这样做
$raw = \DB::raw("@i := coalesce(@i + 1, 1) ranking");
$model->addSelect($raw); // this way
$model->select($raw); // or this way
您将在模型上看到的唯一字段是ranking
。
--
可能值得注意的是,如果你基于像排名一样波动的东西进行分页,你可能会看到一些意想不到的行为。例如,如果第1页显示用户a,b,c,d,e(分别为1-5),并且用户f在访问者点击第2页之前将排名提升到第5位,则他们会看到用户e(现在排名为6) )再次在第2页上看不到用户f(现在排名5)。
有点迟到的反应,但我想通了。这是我的解决方案。
我首先将此功能添加到我的用户模态类。
public function getRanking(){
$collection = collect(User::orderBy('wins', 'DESC')->get());
$data = $collection->where('id', $this->id);
$value = $data->keys()->first() + 1;
return $value;
}
现在在我看来我运行了我的getRanking()函数。
@foreach($ranking as $key => $rankings)
<tr>
<td>{{ $rankings->getRanking() }}</td>
<td><a href="{{ route('profileView', ['id' => $rankings->id]) }}">{{ $rankings->username }}</a></td>
<td>{{ $rankings->wins }}</td>
<td>{{ $rankings->losses }}</td>
</tr>
@endforeach
我正在使用我的数组键来确定用户排名。
晚安!