#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
отношения, но у меня другая структура таблицы, чем у ваших отношений.