Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
验证Laravel5.7中阵列上的重复值(多列唯一)_Laravel_Laravel 5 - Fatal编程技术网

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

验证Laravel5.7中阵列上的重复值(多列唯一),laravel,laravel-5,Laravel,Laravel 5,如下所述 我正在向数据库添加两个字段 // database/migrations/UpdateUsersTable.php public function up() { Schema::table('users', function (Blueprint $table) { $table->string('staff_no' , 10); $table->string('staff_code'); $table->un

如下所述

我正在向数据库添加两个字段

// 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']);
    });
}
我想验证我的数据库或post数组中的多列唯一值是否重复? 这是我的密码:

这是我的控制器

public function MassStore(MassStoreUserRequest $request)
{
    $inputs = $request->get('users');

    //mass store process
    User::massStore($inputs);

    return redirect()->route('admin.users.index');
}
用户控制器

public function MassStore(MassStoreUserRequest $request)
{
    $inputs = $request->get('users');

    //mass store process
    User::massStore($inputs);

    return redirect()->route('admin.users.index');
}
这是我的POST数据(POST数据($inputs)将发送如下所示):

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

  `'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
        }),]
改变

  `'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
        }),]
您可以使用验证规则。所以你的代码看起来像-

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']
    ];
}
您可以使用验证规则。所以你的代码看起来像-

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

我自己解决这个问题

要点是重写方法validationData(),将值“staff\u no\u code”设置为验证数据

这是我的密码:

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

我自己解决这个问题

要点是重写方法validationData(),将值“staff\u no\u code”设置为验证数据

这是我的密码:

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

您好,我的数据库正在设置为多列唯一$table->unique(['staff\u no','staff\u code']);'distinct“只检查一个字段,就像我的问题电子邮件一样。所以“distinct”不是我想要的答案。嗨,我的数据库正在设置为多列unique$table->unique(['staff\u no','staff\u code']);'distinct“只检查一个字段,就像我的问题电子邮件一样。所以“独特”不是我想要的答案。我不太明白你的意思。你能发布完整的编码吗@シェバイクン 正如您所看到的,您有$query,使用它来编写查询以检查此组合是否已经存在于数据库中,返回false。文档中有类似的示例检查我的案例是按数组发布的,首先,如何在$query上获取post数组值来设置它?我没有员工模式。它是什么?接下来,除了DB之外,还需要检查阵列上的重复值(多列唯一)。根据您的示例,未检查数组的重复值(多列唯一)@シェバイクン 由于一些网络问题,我的编辑没有保存,现在检查,你会得到更好的想法。我不太明白你的意思。你能发布完整的编码吗@シェバイクン 正如您所看到的,您有$query,使用它来编写查询以检查此组合是否已经存在于数据库中,返回false。文档中有类似的示例检查我的案例是按数组发布的,首先,如何在$query上获取post数组值来设置它?我没有员工模式。它是什么?接下来,除了DB之外,还需要检查阵列上的重复值(多列唯一)。根据您的示例,未检查数组的重复值(多列唯一)@シェバイクン 由于某些网络问题,我的编辑未保存,请立即检查,您将了解更多信息。