laravel - 按相关表结果的计数对数组进行排序
问题描述
我正在尝试以下操作:
我有两个模型:Pub 和 User,由一个名为“recommended_pubs”的中间表关联,其中用户将某个 pub 设置为“推荐”。
关系为 NxN,如下所示:
酒馆:
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function recommendedUsers()
{
return $this->belongsToMany(User::class, 'recommended_pubs');
}
用户:
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function recommendedPubs()
{
return $this->belongsToMany(Pub::class, 'recommended_pubs');
}
Recommended_pubs 表有以下字段:id|user_id|pub_id
我想从其他函数($pubs)接收一组特定的 pub,然后按用户推荐的 pub 的次数对它们进行排序。
我尝试了以下方法并且有效:
$pubs = Pub::leftJoin('recommended_pubs', 'recommended_pubs.pub_id', '=', 'pubs.id')
->leftJoin('users', 'recommended_pubs.pub_id', '=', 'users.id')
->groupBy('pubs.id')
->orderBy('users_count','desc')
->selectRaw('pubs.*, count(users.id) as users_count')
->get()
;
任何想法?我尝试在 foreach 中执行此操作,但在修改 leftjoins 时遇到了一些问题...
非常感谢!!
解决方案
使用withCount()
:
Pub::withCount('recommendedUsers')
->orderBy('recommended_users_count', 'desc')
->get();