Laravel如何使用Eloquent获取对象的行号?

Wil*_*ino 2 laravel eloquent laravel-4

我想根据创建日期了解用户的位置.我如何使用Eloquent做到这一点?

我希望能够做到这样的事情:

User::getRowNumber($user_obj);
Run Code Online (Sandbox Code Playgroud)

Jar*_*zyk 9

我想你想要MySQL解决方案,所以你可以这样做:

DB::statement(DB::raw('set @row:=0'));
User::selectRaw('*, @row:=@row+1 as row')->get();
// returns all users with ordinal 'row'
Run Code Online (Sandbox Code Playgroud)

所以你可以实现这样的事情:

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;
}
Run Code Online (Sandbox Code Playgroud)

这需要从表中选择所有行,直到找到您要查找的行,然后仅选择该特定行号.

它会让你这样做:

$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
Run Code Online (Sandbox Code Playgroud)

由于此范围要求@row每次将原始语句设置为0,因此我们使用缓存1分钟以避免不必要的查询.