Форма Laravel не обновляет значения в базе данных, а просто удаляет их

У меня есть форма, где я могу изменить роль пользователя. Когда я пытаюсь изменить и нажать кнопку «Сохранить», у меня появляется неверный аргумент 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'));

верните правильный идентификатор, который я выбрал на флажок.

2

Решение

Вам нужно удалить существующую роль и прикрепить новую, например:

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')]);

Этот способ уменьшит дополнительные затраты на ненужное удаление, и только одним запросом вы можете обновить роль пользователя.

Я надеюсь, что вы поняли.

1

Другие решения

Вы получаете роль в виде строки, а не в виде массива, поэтому напрямую назначьте ее без цикла

DB::table('role_user')->where('user_id',$id)->delete();
$value = $request->input('roles');
$user->attachRole($value);
1

Я полагаю, ваш 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');
1

Причина, по которой вы допустили эту ошибку, потому что, по вашему мнению, вы определили роли как однозначный вход. Вам нужно добавить [] на имя вашего входа.

{{ 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');
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector