Отношения Laravel, возвращающие имя вместо идентификатора

#laravel

Вопрос:

У меня есть 3 стола. Таблица разрешений пользователя указывает, у какого пользователя есть какие разрешения.

Таблица пользователей

 id | name
 1 | jack
 2 | bob
 

Таблица разрешений

 id |     name
 1 |  manage users
 2 |  manage jobs
 

Таблица разрешений пользователя

 id | user_id | permission_id
 1 |    1    |     1
 2 |    1    |     2
 3 |    2    |     1 
 

Модель пользователя

 public function userPermission()
{
   return $this->hasMany(UserPermission::class);
}
 

Модель взаимодействия с пользователем

 public function user()
{
   return $this->belongsTo(User::class);
}
 

Если я выполняю аутентификацию()->пользователь()->>Разрешение пользователя, я получаю все данные из таблицы разрешений для этого пользователя. Есть ли способ, чтобы вместо получения идентификатора таблицы разрешений я вместо этого получал все имена разрешений ? Может быть, в массиве. Таким образом, у пользователя Джека будет [«управление пользователями»,»управление заданиями»]

Ответ №1:

Я видел, что Пользователь и разрешение имеют отношения «многие ко многим». https://laravel.com/docs/8.x/eloquent-relationships#many-to-many

Убедитесь, что имя таблицы разрешений пользователя — «permission_user», и в модели пользователя вы должны определить метод отношения следующим образом :

 public function permission() {
    return $this->belongsToMany(Permission::class);
}
 

Поэтому , когда вы звоните auth()->user()->permission , вы можете получить коллекцию классов разрешений, принадлежащих пользователю.

Если вы хотите получить имя всех разрешений, принадлежащих пользователю. Просто используйте метод pluck() сбора. Ссылка: https://laravel.com/docs/8.x/collections#method-pluck

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

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

2. @stalwart1014 Да, я видел, что таблица разрешений пользователя похожа на сводную таблицу для сохранения этой связи. С какой проблемой вы столкнулись?

3. Мне нужно получить все имена разрешений, которые есть у этого пользователя. UserPermission возвращает идентификатор разрешения для этого пользователя, вместо этого мне нужны имена.

4. @stalwart1014 Я понял это. Поэтому я рекомендую вам изменить метод отношения, который вы объявили в классе модели пользователя.

Ответ №2:

Сначала вы должны использовать внешние и локальные ключи в своих отношениях.

Также взгляните на многие отношения и сводные таблицы в Laravel Doc.