Модель сортировки на основе количества вложенных отношений — Laravel 8

#laravel #eloquent

#laravel #красноречивый

Вопрос:

У меня есть три таблицы categories , courses , и users .

courses и users таблица имеет промежуточную таблицу 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 в порядке убывания.

Есть ли какой-нибудь красноречивый способ ее достижения?

Комментарии:

1. Вы можете использовать withCount , а затем использовать его как order by . laravel.com/docs/8.x /…

2. Я хочу количество вложенных отношений, т. Е. users Тогда категории должны быть отсортированы на основе этого количества, т.е. users_count

3. withCount используется для этого с такими hasManyThrough отношениями, как @Anrut Chapanond использовал его в своем ответе

Ответ №1:

Вы должны определить 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();
 

Комментарии:

1. голосовать, потому что решение состояло в том, чтобы использовать hasManyThrough отношения, но у меня другая структура таблицы, чем у ваших отношений.