php - Laravel 5 Eloquent : How do I sort db rows and also get rank?

标签 php mysql laravel laravel-5 eloquent

我有一个具有一对多关系的用户和引用表。我试图根据与其他用户相比的推荐计数来获得用户的排名。我只能根据推荐计数列出用户。

$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;

关于php - Laravel 5 Eloquent : How do I sort db rows and also get rank?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32982456/

相关文章:

php - CakePHP 问题 : Unexpected call to database

PHP set_time_limit 有效但返回 false

Mysql数据库实现动态数量的字段

c++ - 使用 mysql c++ 连接器的 undefined reference

php - Laravel Controller 中的 foreach 循环

javascript - 如何在 PHP(Laravel) 中生成 Cloudinary 身份验证签名

php - 用于检测嵌套匹配的 PCRE 模式

PHP代码没有被执行,但是代码显示在浏览器源代码中

asp.net - MySQL session 状态提供程序在过期的 session 上崩溃

具有 hasmany 关系的 Laravel 查询