laravel - 在 Laravel5.7 中验证数组上的重复值(多列唯一)
问题描述
与以下问题有关
我在数据库中添加了两个字段。
// database/migrations/UpdateUsersTable.php
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('staff_no' , 10);
$table->string('staff_code');
$table->unique(['staff_no', 'staff_code']);
});
}
我想验证我的数据库中的多列唯一性或后数组值是否重复?这是我的代码:
这是我的控制器
用户控制器
public function MassStore(MassStoreUserRequest $request)
{
$inputs = $request->get('users');
//mass store process
User::massStore($inputs);
return redirect()->route('admin.users.index');
}
这是我的 POST 数据(post data($inputs) 将发送如下):
'users' => [
[
'name' => 'Ken Tse',
'email' => 'ken@gamil.com',
'password' => 'ken12ken34ken',
'staff_no' => '20191201CT',
'staff_code' => 'IT-1azz',
],
[
'name' => 'Tom Yeung',
'email' => 'tom@gamil.com',
'password' => 'tom2222gt',
'staff_no' => '20191201CT', // staff_no + staff_code is duplicate, so need trigger error
'staff_code' => 'IT-1azz',
],
]
MassStoreUserRequest
public function rules()
{
return [
'users' => ['required','array'],
'users.*.name' => ['required'],
'users.*.email' => ['required','unique:users','email', 'distinct'],
'users.*.password' => ['required','string','min:8'],
'users.*.staff_no' => ['required','size:10'],
'users.*.staff_code' => ['required','string']
// how to set verify duplicate values(staff_no,staff_code unique) in here?
];
}
解决方案
我自己解决了这个问题。
https://laravel.com/api/5.7/Illuminate/Foundation/Http/FormRequest.html#method_validationData
要点是覆盖方法validationData(),将值“staff_no_code”设置为验证数据。
这是我的代码:
MassStoreUserRequest
public function rules()
{
$validate_func = function($attribute, $value, $fail) {
$user = User::where(DB::raw("CONCAT(staff_no,staff_code )", '=', $value))
->first();
if (!empty($user->id)) {
$fail(trans('validation.alreadyExists'));
}
};
return [
'users' => ['required','array'],
'users.*.name' => ['required'],
'users.*.email' => ['required','unique:users','email', 'distinct'],
'users.*.password' => ['required','string','min:8'],
'users.*.staff_no' => ['required','size:10'],
'users.*.staff_code' => ['required','string']
// 'distinct' check when working with arrays, the field under validation must not have any duplicate values.
// $validate_func check DB exist
'users.*.staff_no_code' => ['distinct',$validate_func]
];
}
//make value "staff_no_code" to validation data
protected function validationData()
{
$inputs = $this->input();
$datas = [];
foreach ($inputs as $input ) {
$input['staff_no_code'] = $input['staff_no'] . $input['staff_code'];
$datas[] = $input;
}
return $datas;
}
推荐阅读
- javascript - 从 REST api 下载文件时出现 Javascript 错误
- python - 如何解决ValueError:类的数量必须大于1;上了一堂课
- c# - 如何在 JsonResult 中返回 Jtoken
- php - 域和子域之间的会话。如果服务器托管多个域怎么办
- c# - 识别 CWE 424 - 备用路径保护不当
- r - 我如何计算 lapply 的迭代次数?
- javascript - 如何将道具从父组件渲染到子组件?
- python - 使用 plotly FigureWidget on_click 函数绘制新图形
- c++ - 为什么预处理器指令会影响我的 C++ 向量?
- javascript - React:遍历对象并更改某些属性