我想根据用户的创建日期了解用户的位置。我如何使用 Eloquent 做到这一点?
我希望能够做这样的事情:
User::getRowNumber($user_obj);
最佳答案
我想你想要 MySQL 解决方案,所以你可以这样做:
DB::statement(DB::raw('set @row:=0'));
User::selectRaw('*, @row:=@row+1 as row')->get();
// returns all users with ordinal 'row'
所以你可以实现这样的东西:
public function scopeWithRowNumber($query, $column = 'created_at', $order = 'asc')
{
DB::statement(DB::raw('set @row=0'));
$sub = static::selectRaw('*, @row:=@row+1 as row')
->orderBy($column, $order)->toSql();
$query->remember(1)->from(DB::raw("({$sub}) as sub"));
}
public function getRowNumber($column = 'created_at', $order = 'asc')
{
$order = ($order == 'asc') ? 'asc' : 'desc';
$key = "userRow.{$this->id}.{$column}.{$order}";
if (Cache::get($key)) return Cache::get($key);
$row = $this->withRowNumber($column, $order)
->where($column, '<=',$this->$column)
->whereId($this->id)->pluck('row');
Cache::put($key, $row);
return $row;
}
这需要从表中选择所有行,直到找到您要查找的行,然后仅选择该特定行号。
它会让你这样做:
$user = User::find(15);
$user->getRowNumber(); // as default ordered by created_at ascending
$user->getRowNumber('username'); // check order for another column
$user->getRowNumber('updated_at', 'desc'); // different combination of column and order
// and utilizing the scope:
User::withRowNumber()->take(20)->get(); // returns collection with additional property 'row' for each user
由于此范围需要原始语句设置
@row
每次都设置为 0,我们使用缓存 1 分钟以避免不必要的查询。
关于Laravel 如何使用 Eloquent 获取对象的行号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23408091/