在OrderBy Eloquent查询中获取行的排名

时间:2014-07-07 22:46:37

标签: php mysql database laravel eloquent

据我所知,这似乎是一个记录在案的mySQL问题。但是,我没有找到Eloquent解决方案来获取orderBy查询中的行级别。这就是我想要的。

我有一张看起来像这样的表

id | number
-----------
1  | 30
2  | 24
3  | 4
4  | 45

我可以在此查询中订购数字列:

Number::orderBy('number', 'desc')->get();

但是,我想检索每一行的排名。因此,id为4(数字为45)的行的等级为1. id为1的行(和数字为30)的等级为2。

使用Eloquent查询获取行排名的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

laravel's Eloquent ...... 将其添加到您的模型中。释放T.Otwells Eloquent的伟大之处;)

public function getPostionAttribute()
{
    return $this->newQuery()->where('number', '>=', $this->number)->count();
}

答案 1 :(得分:0)

真的很简单,你现在拥有的东西会起作用。

$i = 1;
$numbers = Number::orderBy('number', 'desc')->get();

foreach($numbers as $number)
{
    echo $i . ' ' . $number->id;
    $i++;
}

答案 2 :(得分:0)

在MySQL中你可以依赖它(如果你愿意的话,重命名行排名)来获取多个记录而不是每个模型查询:

// any Model, model trait or whatever you like
// for convenience wrapped in scope
public function scopeGetWithRowNumber($query, $columns = ['*'])
{
    // Set the row number
    $offset = (int) $query->getQuery()->offset;
    DB::statement(DB::raw("set @row={$offset}"));

    // Adjust SELECT clause to contain the row
    if ( ! count($query->getQuery()->columns)) $query->select($columns);
    $sub = $query->addSelect([DB::raw('@row:=@row+1 as row')]);

    // Return the result instead of builder object
    return $query->get();
}

然后使用您运行任何查询:

Number::getWithRowNumber(); // SELECT * + row attribute starting from 1

Number::take(25)->skip(2500)->getWithRowNumber(); // SELECT * + row 2501+

Number::latest()->getWithRowNumber(['id','number']); // SELECT id, number + row 1+

Number::orderBy('number','desc')->getWithRowNumber(); // example from your question