Laravel 5.4, как назначить роли пользователю по запросу формы?

у меня есть список пользователей, и здесь я поставил возможность назначить роль каждому пользователю, для этого при нажатии ссылки «Добавить роль» он покажет этот маршрут

Route::get('admin/home/role/{user}', 'RoleController@create');

в функции создания мой код формы...

<form method="post" action="{{ url('admin/home/role') }}">
  {{ csrf_field()   }}


   <div class="form-group">
    <select name="role" class="form-control" >
      <option value="1"> Admin </option>
      <option value="2"> Editor</option>
    </select>
   </div>

    <button type="submit" class="btn btn-primary">
        Add Role
    </button>
  </form>

для управления этой формой мой маршрут POST...

Route::post('admin/home/role', 'RoleController@store');

теперь, как вставить эти данные запроса формы в таблицу role_user? ой! у меня уже есть 3 таблицы, пользователи, роли и role_user.

Код отношения пользовательской модели...

 public function role()
{
    return $this->belongsToMany(Role::class, 'role_user');
} 

Кодекс отношений для подражания - это...

public function user()
{
    return $this->belongsToMany(User::class, 'role_user');
}  

мой вопрос: как вставить данные запроса формы в таблицу role_user? Я знаю один способ, это...

public function store(Request $request, User $user)
{

    $role = Role::find(1);
    $user = User::find(19);

    $role->user()->attach($user);


}

это работает, но это не динамично. Как вставить по запросу формы? пожалуйста, помогите мне. Я искал учебник по этой теме, но не нашел.


person Masum    schedule 20.05.2017    source источник


Ответы (1)


вам нужно отправить значение Role id и user id для сохранения функции

public function store(Request $request)
{
     $user_id=$request->input('user_id'); // get user id from post request
     $role_id=$request->input('role_id'); // get  Role id from post request

      /* Todo request validation*/


    $user = User::find($user_id);
    $role = Role::find($role_id);


    $user->roles()->attach($role);
}

Посмотреть :

<form method="post" action="{{ action('RoleController@store') }}">
  {{ csrf_field()   }}
  <input type="hidden" name="user_id" value="{{ $user->id }}" /> // you need to pass $user to this view  
   <div class="form-group">
    <select name="role_id" class="form-control" >
      <option value="1"> Admin </option>
      <option value="2"> Editor</option>
    </select>
   </div>

    <button type="submit" class="btn btn-primary">
        Add Role
    </button>
  </form>
person Mortada Jafar    schedule 20.05.2017
comment
пишет новая ошибка. что есть... FatalThrowableError в строке 45 RoleController.php: вызов функции-члена roles() для null - person Masum; 20.05.2017
comment
переименуйте свою роль публичной функции () в пользовательской модели в роли общедоступных функций () - person Mortada Jafar; 20.05.2017
comment
убедитесь в этом: $user-›roles()-›attach($role); - person Mortada Jafar; 20.05.2017
comment
$user-›roles()-›attach($role); это & ​​Функция модели пользователя является общедоступной функцией roles() { return $this-›belongsToMany(Role::class, 'role_user'); } - person Masum; 20.05.2017
comment
проблема здесь... $user_id=$request-›input('user') $role_id=$request-›input('role'); это входное имя было user_id и role_id, теперь измените его на имя пользователя и роль формы, теперь оно работает. tnx Джафар - person Masum; 20.05.2017
comment
пожалуйста, еще один вопрос. каким будет метод обновления, когда я хочу изменить роль пользователя? тогда что будет $user-›roles()-›attach($role); эта линия? - person Masum; 20.05.2017
comment
$user-›roles()-›attach($role); //для добавления ...$user-›roles()-›detach($role); /удалить - person Mortada Jafar; 20.05.2017
comment
да, я знаю, что нужно отсоединить для удаления, но каков метод обновления? когда я изменю роль администратора на редактор, он будет работать как метод создания, он создаст новую строку в таблице, я просто хочу обновить ее. - person Masum; 20.05.2017
comment
вы можете использовать updateExistingPivot($roleId, $attributes); но здесь у вас нет дополнительного поля в сводной таблице ... для этого вам нужно удалить все, используя detach(), а после удаления вы можете прикрепить ($ new_role); - person Mortada Jafar; 20.05.2017