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.
答
试试这个..
$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;
既然你已经整理数组,你知道这个数组中的第一个用户拥有最转介。所以他们将排名第一。不是那么简单吗?你还需要什么 ? – codegeek
我需要排名#表示用户与其他用户相比最多。我在用户资料中显示了这一点。所以像user-> rank =?但我不想创建排名栏。我想根据排序获得特定用户的排名。希望这是有道理的。 – joejoeso