据我所知,这似乎是一个记录在案的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查询获取行排名的最佳方法是什么?
答案 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