Где ошибка в связи таблиц?

Здравствуйте. Делаю связь между таблицами (многие ко многим)
Есть таблица user, roles, role_user
role_user:
Schema::create('role_user', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('user_id')->unsigned();
    $table->foreign('user_id')->references('id')->on('users');
    $table->integer('role_id')->unsigned();
    $table->foreign('role_id')->references('id')->on('roles');
    $table->timestamps();
});

5ca474985682d151802478.pngВ модели User:
public function roles()
{
    return $this->belongsToMany('App\Role');
}


В одном из контроллеров пытаюсь сделать (скорее всего не правильно получаю название роли):
$roles = User::where('id', '1')->first()->roles();
foreach ($roles as $role) {
    echo $role->name;
}


dd($roles) выдает
5ca475fd6fff4597075524.png

Как мне получить название роли?
  • Вопрос задан
  • 100 просмотров
Решения вопроса 2
crashxd
@crashxd
Backend разработчик
$roles = User::where('id', '1')->first()->roles();

Так ты только получаешь запрос.
Чтобы получить окончательный результат либо добавляй в конце ...->get(), либо сразу вызывай ->roles:
$roles = User::where('id', '1')->first()->roles()->get();
$roles = User::where('id', '1')->first()->roles;
В обоих случаях $roles будет хранить коллекцию ролей, а не просто запрос.
Ответ написан
Комментировать
@Result007
P|-|P
Своим запросом вы не получаете коллекцию объектов. Либо ...->roles()->get() либо так:
$user = User::where('id', '1')->first();
foreach ($user->roles as $role) {
    echo $role->name;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@jazzus
Пишите правильно. В модели User
public function roles() {
   return $this->belongsToMany('App\Role', 'role_user', 'user_id', 'role_id');
}

В контроллере
// Роли авторизованного пользователя
$roles = Auth::user()->roles()->get();
// Роли любого пользователя по id
$id = 5;
$roles = User::find($id)->roles()->get();
// Все юзеры с их ролями и количеством ролей 
$users = User::with('roles')
             ->withCount('roles')
             ->get();

В шаблоне
//роли юзера
@foreach ($roles as $role)
  {{ $role->name }}
@endforeach
// Роли у всех юзеров
@foreach ($users as $user)
        //количество ролей у юзера
        {{$user->roles_count}}
        //названия ролей у каждого юзера
        @foreach ($user->roles as $role)
          {{ $role->name }}
        @endforeach
 @endforeach

Добавляем константу админа в модель Role
const ID__ADMIN = 17;
В контроллере
// Сделать юзера админом
$user->roles()->attach(Role::ID__ADMIN);
// админы
$admins = Role::find(Role::ID__ADMIN)->users()->get();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы