Laravel 5.6:如果字段存在且未更改,则跳过验证步骤。如果字段已更改,则它是必需的 - 但不是唯一的

Laravel 5.6: Skip validation step if field exists and isn't changed. If field IS changed it is Required - but not unique

我遇到管理员编辑员工表格的情况:添加员工时需要名字、姓氏和 SSN。那里没有问题。我遇到问题的地方是编辑表格时。我在验证 SSN 时没有问题,因为它是一个唯一字段。

'ssn_edit' => 'required|unique:employees,ssn,' . $id

但我确实有一个问题是非唯一字段。当字段不唯一时,我不知道如何将验证设置为按 ID 跳过。这是 FormRequest 的整个规则部分:

public function rules()
{
    $id = $this->input('employee_id');
    return [
        'first_name' => 'required',
        'last_name' => 'required',
        'ssn_edit' => 'required|unique:employees,ssn,' . $id
    ];
}

显然 - 这会在 first_name 和 last_name 上引发验证错误,无论该字段是否已填充。 你们中的一些 Laravel 专家可以帮助我,我将不胜感激!

您在验证非唯一字段时一定没有错误,可能是您的编辑表单有误,将 value 属性设置为输入

<input type="text" value="{{ $employee->first_name }}" name="first_name">

解决问题的技巧有很多。但是我只有两个办法..

第一个是:防止在您想要编辑员工时发送您的 ssn_edit 值

示例:

<input type="text" value="{{ isset($employee) ? $employee->ssn_edit : old('ssn_edit') }}" @isset($employee) disabled @endisset name="ssn_edit">

public function rules()
{
    $id = $this->input('employee_id');
    return [
        'first_name' => 'required',
        'last_name' => 'required',
        'ssn_edit' => 'required|sometimes|unique:employees,ssn,' . $id
    ];
}

第二个是:在验证员工之前检查您的方法..是 POST 还是 PUT,如果是 PUT,请不要在验证中添加唯一规则。

结论:无论您是编辑还是添加新员工,每次调用验证时验证都会起作用。 #CMIIW