在Laravel5.7中验证数组上的重复值(多列唯一)

时间:2019-12-12 06:17:34

标签: laravel laravel-5

与以下问题有关

Verify duplicate values on the array in 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']);
    });
}

我想验证数据库或帖子数组值中唯一的多列是否重复? 这是我的代码:

这是我的 Controller

UsersController

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

3 个答案:

答案 0 :(得分:0)

更改

  `'users.*.staff_code'   => ['required','string']` line to



'users.*.staff_code'   => ['required','string',  Rule::exists('staff')->where(function ($query) {
            //condition to check if staff_code and staff_no combination is unique
             return $query->where('staff_code', $request->('your_key')['staff_code'])->where('staff_no', $request->('your_key')['staff_no']) ? false : true; // You may need to make a loop if you can not specify key
        }),]

答案 1 :(得分:0)

您可以使用distinct验证规则。因此您的代码看起来像-

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', 'distinct']
    ];
}

答案 2 :(得分:0)

我自己解决了这个问题。

https://laravel.com/api/5.7/Illuminate/Foundation/Http/FormRequest.html#method_validationData

主要要点是重写方法validateData(),使值“ 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;
    }