按相关 table 结果的计数对数组进行排序

Ordering an array by the count of a related table result

我正在尝试以下操作:

我有两个模型:Pub 和 User,由一个称为 'recommended_pubs' 的中间 table 关联,其中用户将某个 pub 设置为 "recommended"。

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 table 有以下字段: id|user_id|pub_id

我想从其他函数 ($pubs) 接收一组特定的酒吧,然后按用户推荐酒吧的次数对它们进行排序。

我尝试了以下方法并且有效:

$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 中执行此操作,但在修改左连接时遇到了一些问题...

非常感谢!!

使用withCount():

Pub::withCount('recommendedUsers')
    ->orderBy('recommended_users_count', 'desc')
    ->get();