У меня есть форма, где я могу изменить роль пользователя. Когда я пытаюсь изменить и нажать кнопку «Сохранить», у меня появляется неверный аргумент foreach (), и предыдущая запись в базе данных для этого пользователя полностью удаляется.
Это моя форма
{!! Form::model($user, ['method' => 'PATCH','route' => ['admin.addper', $user->user_id]]) !!}
<div class="row">
<div class="col-md-4 col-xs-12">
<div class="form-group">
<label for="title" class="control-block">Username:</label>
{{ Form::text('username', $user->username, ['class' => 'form-control', 'disabled']) }}
</div>
</div><!-- end col-4/12 -->
<div class="col-xs-12 col-md-8">
<div class="form-group">
<label for="title" class="control-block">Choose which Role you want to assign to user:</label><br>
@foreach($roles as $value)
{{ Form::checkbox('roles', $value->id, in_array($value->id, $userRole) ? true : false, array('class' => 'name')) }}
<strong>{{ $value->display_name }}</strong>
<br/>
@endforeach
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-12 text-center">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</div>
{!! Form::close() !!}
И это часть контроллера
public function update(Request $request, $id)
{
$this->validate($request, [
'roles' => 'required'
]);
$input = $request->all();
$user = User::find($id);
$user->update($input);
DB::table('role_user')->where('user_id',$id)->delete();
foreach ($request->input('roles') as $key => $value) {
$user->attachRole($value);
}
return redirect()->route('users')
->with('success','User Role Updated Successfully');
}
Ошибка на foreach
в контроллере
ErrorException:
В foreach указан неверный аргумент ()
Так как я уверен, что я сдаю правильно user_id
и правильное значение role_id
почему эта ошибка?
dd($request->input('roles'));
верните правильный идентификатор, который я выбрал на флажок.
Вам нужно удалить существующую роль и прикрепить новую, например:
DB::table('role_user')->where('user_id',$id)->delete();
$user->attachRole($request->input('roles'));
Я думаю, что у вас есть одна роль в role_user
таблица для каждого пользователя, так что вы также можете использовать метод поиска и обновления.
Подобно,
DB::table('role_user')
->where('user_id',$id)
->update(['role' => $request->input('roles')]);
Этот способ уменьшит дополнительные затраты на ненужное удаление, и только одним запросом вы можете обновить роль пользователя.
Я надеюсь, что вы поняли.
Вы получаете роль в виде строки, а не в виде массива, поэтому напрямую назначьте ее без цикла
DB::table('role_user')->where('user_id',$id)->delete();
$value = $request->input('roles');
$user->attachRole($value);
Я полагаю, ваш roles
это массив. Тогда используйте
foreach ($request->input('roles') as $value)
{
$user->attachRole($value);
}
Причина в том, что у вас есть только одно значение идентификатора, а не ассоциативный массив. Итак, вы пытаетесь использовать неверный параметр для foreach
Если твой roles
это не массив сделать его одним.
Этот метод позволяет использовать более 1 роли.
Например, чтобы сделать ваш $request->input('roles')
массив
попробуй с
if(!is_array($input->request('roles')))
$roles[] = $input->request('roles');
Причина, по которой вы допустили эту ошибку, потому что, по вашему мнению, вы определили роли как однозначный вход. Вам нужно добавить []
на имя вашего входа.
{{ Form::checkbox('roles[]', $value->id, in_array($value->id, $userRole) ? true : false, array('class' => 'name')) }}
Тогда вы можете получить доступ roles
как массив в вашем контроллере. Но вам нужно проверить на наличие roles
или передать значение по умолчанию, так как оно не отправляется на сервер, если все флажки сняты.
foreach ($request->input('roles', []) as $role) {
$user->attachRole($role)
}
Или вы можете использовать Eloquent и определить roles
отношения в вашем user
модель.
public function roles()
{
return $this->belongsToMany('roles');
}
и в вашем контроллере
public function update(Request $request, $id)
{
$this->validate($request, [
'roles' => 'required'
]);
$user = User::find($id);
$user->update($request->all());
$user->roles()->sync($request->input('roles', []));
return redirect()->route('users')
->with('success','User Role Updated Successfully');
}