如何验证Laravel中两个字段的独特组合?

问题描述 投票:0回答:1

我试图在新用户的注册上添加验证约束,我希望两个字段的组合在数据库中是唯一的。我得到的错误来自数据库,说我有完整性约束违规。我所拥有的表称为用户,我想要具有唯一组合的字段称为ssn和lastfour。

我添加了行$ table-> unique(array('ssn','lastfour'));在用户迁移中,我还在注册中添加了一些工作正常且数据库正常的字段。我在9个月前Laravel unique validation on multiple columns发布的类似问题中尝试了该解决方案,但我得到了未定义的变量“Rule :: unique('servers') - > where(function($ query)use($ ssn,$ lastfour)”

protected function validator(array $data)
{
    return Validator::make($data, [
        'name' => ['required', 'string', 'max:255'],
        'lastname' => ['required', 'string', 'max:255'],
        'username' => ['required', 'string', 'max:255', 'unique:users'],
        'ssn' => ['required', 'string', 'regex:/^[0-9]*$/','max:8', 'min:8'],
        'lastfour' => ['required', 'string', 'regex:/^[0-9]*$/','max:4', 'min:4'],
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
        'password' => ['required', 'string', 'min:6', 'confirmed'],
    ]);
}

我尝试了以下代码

'lastfour' => ['required', 'string', 'regex:/^[0-9]*$/','max:4', 'min:4', 
                        Rule::unique('users')->where(function ($query) use 
                        ($ssn, $lastfour){
                            return $query->where('ssn', $ssn)
                            ->where('lastfour', $lastfour);
                        })
        ],
php laravel validation unique registration
1个回答
1
投票

$ssn$lastfour似乎没有在任何地方定义。您可以尝试以下方式:

protected function validator(array $data)
{
    $uniqueRule =  Rule::unique('users')->where(function ($query) use 
                    ($data){
                        return $query->where('ssn', $data['ssn']??'')
                        ->where('lastfour', $data['lastfour']??'');
                    });

    return Validator::make($data, [
        'name' => ['required', 'string', 'max:255'],
        'lastname' => ['required', 'string', 'max:255'],
        'username' => ['required', 'string', 'max:255', 'unique:users'],
        'ssn' => ['required', 'string', 'regex:/^[0-9]*$/','max:8', 'min:8',  $uniqueRule ],
        'lastfour' => ['required', 'string', 'regex:/^[0-9]*$/','max:4', 'min:4'],
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
        'password' => ['required', 'string', 'min:6', 'confirmed'],
    ]);
}
© www.soinside.com 2019 - 2024. All rights reserved.