Laravel编辑员工手机号时请求层手机号唯一性校验问题问询
解决方案
1. 修正前端回填逻辑
- 先修正手机号输入框的旧值回填字段名,把原来的
value="{{ old('staffMobileNumber') }}"改成value="{{ old('EditstaffMobileNumber') }}",和提交的字段名保持一致,避免校验不通过后旧值无法正确回填。 - 完善员工下拉的联动逻辑:当下拉框
EditStaffSelect选中值变化时,调用你已写好的editStaff接口获取对应员工的原有手机号,自动填充到EditstaffMobileNumber输入框中,减少用户操作。
2. 修改表单验证规则
找到你定义的App\Http\Requests\EditStaff表单请求类,调整手机号的唯一性校验规则,排除当前正在编辑的员工ID即可:
public function rules() { return [ // 先确保员工下拉必须选择有效ID 'EditStaffSelect' => 'required|integer|gt:0', // 手机号唯一性校验排除当前编辑员工 'EditstaffMobileNumber' => [ 'required', 'numeric', \Illuminate\Validation\Rule::unique('Staffs', 'mobile')->ignore($this->input('EditStaffSelect')), ], // 其他原有规则保持不变 ]; }
规则说明
Rule::unique方法的ignore参数会在校验唯一性时,跳过ID等于提交的EditStaffSelect的那条员工记录,也就是当前编辑的员工自己的手机号不会被判定为重复。- 如果你的
Staffs表开启了软删除,需要在规则后追加->whereNull('deleted_at'),排除已删除的记录。
可选:控制器内验证写法
如果你没有使用单独的表单请求类,而是直接在editStaffDone方法内做校验,写法如下:
public function editStaffDone(Request $request) { $validated = $request->validate([ 'EditStaffSelect' => 'required|integer|gt:0', 'EditstaffMobileNumber' => [ 'required', 'numeric', \Illuminate\Validation\Rule::unique('Staffs', 'mobile')->ignore($request->input('EditStaffSelect')), ], ]); // 原有更新逻辑保持不变 Staff::where('id', '=', $request->EditStaffSelect)->update([ 'mobile' => $request->EditstaffMobileNumber, ]); return redirect()->back()->with(['success_insert' => __('messages.success update')]); }
逻辑验证
- 提交时如果没有修改原有手机号:校验时会跳过当前员工的记录,不会触发唯一性报错。
- 如果修改为其他员工已占用的手机号:会正常触发唯一性校验报错。
- 如果修改为未被使用的新手机号:校验通过,正常更新。
内容的提问来源于stack exchange,提问作者ahmad almasri
相关产品推荐
相关产品推荐

