laravel-admin表单验证身份证,并在编辑时忽略当前编辑行的唯一性认证
2020-01-15 admin laravel 1964
在使用laravel-admin时,我们经常要用到model-form验证规则来验证表单提交的数据,例如:
$form->text($column, [$label])->rules('required|min:10');
直接使用rules加验证规则就可以了,如果要加上正则,比如中国的18位身份证,可以这样写:
$form->text('sfzh', '身份证号')->rules(["regex:/^[1-9]\d{5}(18|19|20|(3\d))\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9X]$/"]);
另外一个常用的场景是,我们需要验证输入的身份证在数据库yuangong是否已存在,存在则不能创建更新,方法是写上unique:
$form->text('sfzh', '身份证号')->rules(["unique:yuangong",]);
不过,这个写法有一个BUG:编辑时,即使不更改身份证号码,也无法提交。原因是该身份证号码已存在了,需要在验证时,忽略该行的身份证验证才能提交。官网文档是错误的:
(['required', "unique:user_table,username,{{id}}"]);
这样并不能忽略该行数据,验证时无法通过。解决办法是使用laravel的Illuminate\Validation\Rule,方法如下:
use Illuminate\Validation\Rule; $form->text('sfzh', '身份证号')->rules(function ($form) { return [ 'required', Rule::unique('yuangong')->ignore($form->model()->id), "regex:/^[1-9]\d{5}(18|19|20|(3\d))\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9X]$/", ]; });
这样,编辑时忽略掉该行的身份证唯一认定,可以编辑成功,而且依然能保证唯一性。