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);
我想根据表单中设置的值取消选中/选中 '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);