Laravel 5雄辩:我如何对db行进行排序并获得排名?

问题描述:

我有一个一对多关系的用户和推荐表。我试图根据推荐计数与其他用户相比获得用户的排名。我只能根据其转诊次数列出用户。Laravel 5雄辩:我如何对db行进行排序并获得排名?

$users = App\User::with('referrals')->get()->sortBy(function($user) 
{return $user->referrals->count();}); 

但我不知道如何获得排名或基于推荐计数排序行。

这是我的推荐表:

Schema::create('referrals',function(Blueprint $table){ 
     $table->increments('id'); 
     $table->bigInteger('user_id'); 
     $table->foreign('user_id')->references('id')->on('users'); 
     $table->bigInteger('referral_id'); 
     $table->timestamps(); 
    }); 

因此,举例来说,如果我在我的数据库有此

user id 1 | 5 referrals 
user id 2 | 10 referrals 
user id 3 | 1 referral 

我希望能够得到用户ID 2,这是军衔1.

+0

既然你已经整理数组,你知道这个数组中的第一个用户拥有最转介。所以他们将排名第一。不是那么简单吗?你还需要什么 ? – codegeek

+0

我需要排名#表示用户与其他用户相比最多。我在用户资料中显示了这一点。所以像user-> rank =?但我不想创建排名栏。我想根据排序获得特定用户的排名。希望这是有道理的。 – joejoeso

试试这个..

$users = App\User::with('referrals') 
        ->get() 
        ->sortBy(function($user) { return $user->referrals->count(); }, SORT_REGULAR, TRUE); 

但请记住这种排序不会发生在数据库中。 现在的排名,

$rank = 0; 
$last_count = -1; 
foreach($users as $user){ 
    if(count($user->referrals) != $last_count){ 
     $rank++; 
     $last_count = count($user->referrals); 
     $user->rank = $rank; 
    } 
    else { 
     $user->rank = $rank; 
    } 
} 

此代码将排名添加到用户。相同的引荐次数将是相同的排名。

更新:

如果你希望某个特定用户的等级,那么你可以做到这一点..

$rank = 0; 
$last_count = -1; 
foreach($users as $user){ 
    if(count($user->referrals) != $last_count){ 
     $rank++; 
     $last_count = count($user->referrals); 
    } 
    if($user->id == $specificUserId){ 
     break; 
    } 
} 
echo "User's Rank: ".$rank; 
+0

我需要获得每个项目的个人等级。 – joejoeso

+0

谢谢。但是,每次排名变化时,这都会更改数据库列。我只是希望能够根据排序获得特定用户的排名。 – joejoeso

+0

实际上它不会改变db中的任何东西。我刚刚为每个用户对象添加了一个新的属性“rank”。 – NULL