Laravel красноречивая сортировка по имени роли в модели отношений - PullRequest
0 голосов
/ 13 апреля 2020

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

У меня настроено так:

Модели: User, Team, TeamUser, Role

Модель TeamUser сводная модель / таблица (содержащая user_id и team_id. Если стоит упомянуть, я также использую spatie / laravel -permissions для ролей.

Как бы я go вперед, когда я хочу отсортировать пользователей в команде по их role.name? Я говорю об отношении users() в модели Team (см. Ниже пример кода). У некоторых пользователей есть роль team-leader и у большинства есть роль team-seller. Я пытался сделать обычный ..->sortBy('role.name'), но, похоже, это не сработало. Заранее спасибо, если кто-нибудь может мне помочь.

User.php

/**
 * Team relation
 *
 * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
 */
public function team()
{
    return $this->belongsToMany('App\Team', 'team_users', 'user_id', 'team_id');
}

Team.php

/**
 * User relation
 *
 * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
 */
public function users()
{
    return $this->belongsToMany('App\User', 'team_users', 'team_id', 'user_id')->withTimestamps();
}

1 Ответ

1 голос
/ 13 апреля 2020

Если вы хотите упорядочить результат на основе столбца вложенных отношений, вы должны использовать цепочку объединений:

$values = Team::query()->leftJoin('users', 'users.team_id', '=', 'teams.id')
->leftJoin('model_has_roles', function ($join) 
{$join>on('model_has_roles.model_id', '=', 'users.id')
->where('model_has_roles.model_type', '=', 'app\Models\User');})
->leftJoin('roles', 'roles.id', '=', 'model_has_roles.role_id')
->orderBy('roles.name')->get();

Я пробовал, все отлично работает.

пожалуйста обратите внимание, что если вы хотите упорядочить по нескольким столбцам, вы можете добавить предложение 'orderBy' столько, сколько захотите:

->orderBy('roles.name', 'DESC')->orderby('teams.name', 'ASC') //... ext
...