Laravel 7 - 编辑和更新表单中复选框的值

Laravel 7 - Edit and update value of checkbox in form

我想根据表单中设置的值取消选中/选中 'active' 用户的复选框。在 MySQL 数据库中,我在 table 'users' 中添加了 'tinyint (1)' 类型的 'active' 列。我有一个表单来编辑用户的不同值,比如姓名、电子邮件等。当我提交表单时,除了复选框之外的所有内容都更新得很好,所以......我不明白如何确保它是否是未检查值更改为 0。

    /**
         * Show the form for editing the specified resource.
         *
         * @param  \App\User  $user
         * @return \Illuminate\Http\Response
         */
        public function edit($userID)
        {
            //
            $user = User::query()->findOrFail($userID);
            $roles = Role::pluck('role_name','id');
            $departments = Department::all(['id','department_name']);
    
            return view('user.edit',compact('user','roles','departments'));
        }
    
        /**
         * Update the specified resource in storage.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \App\User  $user
         * @return \Illuminate\Http\Response
         */
        public function update(Request $request, $usuarioID)
        {
            $user = User::query()->findOrFail($usuarioID);
    
            $user->update($request->only('name','email','password', 'roles', 'departament_id', 'active'));
            $user->roles()->sync($request->roles);
    
            return back()->with('Success','User updated successfully');
        }

 <form method="POST" action="{{route('User.update', $user->id)}}" class="user" enctype="multipart/form-data"">
    {!! method_field('PUT') !!}

    @csrf

    @include('user.form')
    <!--Roles-->
    <br>
    <div class=" row justify-content-center text-center">

    <div class="col-md-6">
        <h5 class="txt-unam text-center text-primary">@lang('edit.Roles')</h5>
        @foreach($roles as $id => $name)
        <input type="checkbox" value="{{$id}}" {{$user->roles->pluck('id')->contains($id) ? 'checked' : ''}} name="roles[]">
        {{ $name }}
        @endforeach
    </div>

    <div class="col-md-6">
        Active <input type="checkbox" name="active" value="1" {{$user->active ? 'checked' : ''}}>
    </div>
    </div>
    <br>
    <div class="text-center">

        <button class="btn btn-warning" type="submit" value="Update">@lang('edit.Update')</button>
        <button class="btn btn-danger" onclick="cancel()" value="Cancel">@lang('edit.Cancel')</button>
    </div>
</form>

角色的复选框工作正常,但 'active' 复选框不是...值保持为 1,我不知道为什么。有人可以帮助我吗?

当您的复选框未被选中时,您在请求中没有任何价值。因此,您可以在更新方法中使用 isset() 函数进行检查,如下所示:

public function update(Request $request, $usuarioID)
{
    $input = $request->only('name','email','password', 'roles', 'departament_id', 'active');
    if(!isset($request->active))
        $input['active'] = false;
    
    $user = User::query()->findOrFail($usuarioID);

    $user->update($input);
    $user->roles()->sync($request->roles);

    return back()->with('Success','User updated successfully');
}

此外,请确保您在 User.php 模型保护 $fillable 中添加了 'active' 字段。

复选框未选中 $request->only(... ,'active') 数组中不存在活动键。所以更新方法是这样的。

$user->update(['name' => $request->name, 'email' => $request->email, 'password' => $request->password, 'roles' => $request->roles, 'department_id' => $request->department_id])

这就是不更新的原因。

你可以试试这个。

$data = $request->only('name','email','password', 'roles', 'department_id');
$data['active'] = $request->get('active',0); // if checkbox is unchecked is 0 instead of null    
$user->update($data);