首页 > 解决方案 > 按相关表结果的计数对数组进行排序

问题描述

我正在尝试以下操作:

我有两个模型: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 时遇到了一些问题...

非常感谢!!

标签: laraveleloquentsql-order-byhas-and-belongs-to-many

解决方案


使用withCount()

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

推荐阅读