2015-10-07 105 views
0

我有一個一對多關係的用戶和推薦表。我試圖根據推薦計數與其他用戶相比獲得用戶的排名。我只能根據其轉診次數列出用戶。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

回答

0

試試這個..

$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