按关系排序

时间:2016-09-28 18:29:47

标签: laravel laravel-5 eloquent laravel-5.3

如果我有一个名为users的表:

| id | username | password |

一张名为user_stats的表格:

| id | user_id | num_posts |

如何让所有用户按照他们拥有的帖子数量对其进行排序?

我的User.php模型有这种关系:

public function stats()
{
    return $this->hasOne('App\UserStat');
}

我的UserStat.php模型有这种关系:

public function user()
{
    return $this->belongsTo('App\User');
}

我知道我可以使用查询构建器进行连接,例如:

$users = User::join('user_stats', 'users.id', '=', user_stats.user_id')
    ->orderBy('user_stats.num_posts', 'DESC')
    ->get();

但是,使用Eloquent ORM还有更好的方法吗?

3 个答案:

答案 0 :(得分:0)

我不认为你能用Eloquent来处理这个问题,但它可以让你非常接近......你可以使用Collection上的方法让你完成其余的工作方式。

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

答案 1 :(得分:0)

可能是

public function stats()
{
    return $this->hasOne('App\UserStat')->orderBy('num_posts', 'desc');
}

$users = App\User::with('stats')->get();

希望这可以解决您的问题

答案 2 :(得分:0)

短篇小说:

  1. 定义自定义accessor以使$user->postCount可用。
  2. sortByDesc回调函数中使用此访问器。
  3. 冗长的解释:

    1. User模型中定义此自定义访问者。

      public function getPostCountAttribute() {
          $stats = $this->stats;  // from the 'stats()' you have defined
          return $stats->num_posts;
      }
      
    2. 然后,使用sortByDesc对您的收藏品进行排序。当您使用User时,请务必确保postCount模型中的stats()关系已加载,否则Laravel将为您的集合中的每个User对象创建1个查询。 / p>

      //  Eager Loading stats() relationship
      $users = User::with('stats')->get();
      
      //  Sort by descending using the postCount attribute of User
      $sorted = $users->sortByDesc(function ($user) {
          return $user->postCount;
      });