在OrderBy desc Eloquent查询中获取行的排名,如何使这个查询在laravel 5.5中发挥作用呢?)

时间:2017-12-15 01:47:26

标签: php mysql laravel laravel-5 laravel-eloquent

我正在尝试为我的用户提供我的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);

提前致谢!

3 个答案:

答案 0 :(得分:4)

$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雄辩,也会丢失原始列选择。我不确定这是一个错误或预期的行为,但我会调查。

澄清一下,如果你这样做

$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(现在在第2页上再次排名6)并且看不到用户f(现在排名为5)。

答案 1 :(得分:2)

有点迟到的反应,但我想出来了。 这是我的解决方案。

我首先将此功能添加到我的用户模态类中。

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

我正在使用我的数组键来确定用户排名。

晚安!

答案 2 :(得分:0)

一个很晚的答案,但可能对某些人有用。也是 Laravel 新手并使用 Laravel 8。我遇到了完全相同的问题,我在刀片模板 {{$loop->iteration}} 中使用了 laravel 默认的 $loop 属性。 即

    @foreach($toptwentys as $toptwenty)        
       <tr>
         <td>{{$loop->iteration}}</td>        
         <td>{{$toptwenty->name}}</td>
         <td>$ {{number_format($toptwenty->annual_cost)}}</td>
      </tr>
   @endforeach

https://laravel.com/docs/5.3/blade#the-loop-variable