首页 > 解决方案 > 在 Laravel5.7 中验证数组上的重复值(多列唯一)

问题描述

与以下问题有关

在 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?
    ];
}

标签: laravellaravel-5

解决方案


我自己解决了这个问题。

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;
    }

推荐阅读