首页 > 解决方案 > 基于嵌套关系计数的排序模型 - Laravel 8

问题描述

我有三张桌子categoriescoursesusers

courses并且userstable 有中间 table user_courses

他们有以下关系

类别模型

public function courses()
{
    return $this->hasMany(Course::class, 'category_id', 'id');
}

课程模式

public function category()
{
    return $this->belongsTo(Category::class, 'category_id', 'id');
}

public function users()
{
    return $this->belongsToMany(User::class, 'user_courses', 'course_id', 'user_id');
}

现在我想要所有具有用户的课程类别,这些类别应该按users_count降序排列。

有没有什么雄辩的方法来实现它?

标签: laraveleloquent

解决方案


您应该在模型中定义hasManyThrough关系。Category

public function users()
{
    return $this->hasManyThrough(User::class, Course::class);
}

然后您可以使用以下内容对您的用户数进行排序

Category::with('courses.users')
    ->withCount(['users' => function($query) {
        $query->orderBy('users_count', 'desc');
    }])
    ->get();

推荐阅读