Laravel表单不会更新数据库中的值而是删除它们

时间:2017-09-07 04:20:19

标签: php laravel laravel-5

我有可以更改用户角色的表单。当我尝试更改并点击“保存”按钮时,我的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'));

返回我在复选框中选择的正确ID。

4 个答案:

答案 0 :(得分:1)

我假设你的@SpringBootApplication(scanBasePackages = { "com.test" }) public class MyInetgrationApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(MyInetgrationApplication.class); } } 是一个数组。然后使用

roles

原因是你只有一个id值,而不是一个关联数组。因此,您尝试使用foreach ($request->input('roles') as $value) { $user->attachRole($value); }

的无效参数

如果您的foreach不是数组,请将其设为一个。

此方法允许使用多个角色。

例如,使roles成为一个数组 试试

$request->input('roles')

答案 1 :(得分:1)

您将获得角色而不是数组角色,因此无需循环直接分配

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

答案 2 :(得分:1)

您需要删除现有角色并附加新角色:

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

这种方式可以减少不必要删除的额外开销,只需单个查询就可以更新用户的角色。

我希望你能理解。

答案 3 :(得分:0)

您遇到此错误的原因是因为在您的视图中您已将角色定义为单值输入。您需要将[]添加到输入的名称。

{{ 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');
}