This would be a lot easier to do after you grab the results from the database, say you were looping through the results you could just do $loop->iteration in your loop and that would be equal to the position of the item.
If you wanna keep it at the DB level, I had to get hacky - not sure there's a better way to do it:
public function scopeByRating($query)
{
$query->selectRaw("@row_number:=@row_number+1 AS position, name_of_item_db_table_here.*")
->from(DB::raw("name_of_item_db_table_here, (SELECT @row_number:=0) AS t"))
->orderBy('points', 'desc');
}
$items = Item::byRating()->get();
In MySQL 8+ it would get a little cleaner using ROW_NUMBER()