【问题标题】:Laravel 5 Eloquent: How do I sort db rows and also get rank?Laravel 5 Eloquent:我如何对数据库行进行排序并获得排名?
【发布时间】:2016-01-04 02:35:33
【问题描述】:

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

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

【问题讨论】:

  • 由于您已经有排序数组,您知道该数组中的第一个用户拥有最多的推荐。所以他们将有排名 1。这不是很简单吗?你还需要什么?
  • 我需要排名#,表明该用户与其他用户相比拥有最多。我在用户个人资料中显示了这一点。所以像 user-> rank = ?但我不想创建排名列。我想根据排序获得特定用户的排名。希望这是有道理的。

标签: php mysql laravel laravel-5 eloquent


【解决方案1】:

试试这个..

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

但请记住,这种情况不会发生在 DB 中。 现在进行排名,

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

【讨论】:

  • 我需要获取每个项目的单独排名。
  • 谢谢。但这会在每次排名更改时更改 db 列。我只是希望能够根据排序获得特定用户的排名。
  • 实际上它不会改变数据库中的任何东西。我刚刚为每个用户对象添加了一个新属性rank
猜你喜欢
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2016-07-09
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多