如果我有一个名为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还有更好的方法吗?
答案 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)
短篇小说:
$user->postCount
可用。 sortByDesc
回调函数中使用此访问器。冗长的解释:
在User
模型中定义此自定义访问者。
public function getPostCountAttribute() {
$stats = $this->stats; // from the 'stats()' you have defined
return $stats->num_posts;
}
然后,使用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;
});