在 OrderBy desc Eloquent 查询中获取行的排名,我如何使这个查询在 laravel 5.5 eloquents 中工作?)

Cha*_*haj 4 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;
Run Code Online (Sandbox Code Playgroud)

我现在的 Laravel 雄辩查询:

$ranking = User::orderBy('wins', 'DESC')->paginate(10);
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Cha*_*haj 8

回复有点晚,但我想通了。这是我的解决方案。

我首先将此函数添加到我的用户模态类。

public function getRanking(){
   $collection = collect(User::orderBy('wins', 'DESC')->get());
   $data       = $collection->where('id', $this->id);
   $value      = $data->keys()->first() + 1;
   return $value;
}
Run Code Online (Sandbox Code Playgroud)

现在在我看来,我运行了 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
Run Code Online (Sandbox Code Playgroud)

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

晚安!


Ben*_*rne 5

$table = (new User)->getTable();
$select = \DB::raw("@i := coalesce(@i + 1, 1) ranking, {$table}.*")
$users = User::select($select)->orderByDesc('wins')->paginate(5);
Run Code Online (Sandbox Code Playgroud)

在上面,你需要table.*再次选择,因为即使你使用addSelect而不是select雄辩会失去原来的列选择。我不确定这是一个错误还是预期的行为,但我会调查。

澄清一下,如果你只是这样做

$raw = \DB::raw("@i := coalesce(@i + 1, 1) ranking");
$model->addSelect($raw); // this way
$model->select($raw); // or this way
Run Code Online (Sandbox Code Playgroud)

您将在模型上看到的唯一字段是ranking.

——

可能需要注意的是,如果您根据排名等波动的内容进行分页,您可能会看到一些意外行为。例如,如果第 1 页显示用户 a、b、c、d、e(分别为第 1-5 位),而用户 f 在访问者点击第 2 页之前将排名上升到第 5 位,他们会看到用户 e(现在第 6 位) ) 并且在第 2 页时看不​​到用户 f(现在排名 5)。