按相关 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();
我正在尝试以下操作:
我有两个模型: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();