如何验证 Laravel 中两个字段的唯一组合?
how to validate unique combination of two fields in Laravel?
我正在尝试对新用户的注册添加验证约束,我希望两个字段的组合在数据库中是唯一的。我得到的错误来自数据库,说我违反了完整性约束。我拥有的 table 称为用户,我想要具有唯一组合的字段称为 ssn 和 lastfour。
我添加了行 $table->unique(array('ssn','lastfour'));在用户迁移中,我还在注册中添加了一些工作正常并且数据库正常的字段。我在大约 9 个月前发布的类似问题中尝试了该解决方案 但我在行 "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);
})
],
$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'],
]);
}
您也可以使用两个查询
$uniqueRule = Rule::unique('users')->where(function ($query) use ($data){
$query->where('ssn', $data['ssn']);
$query->where('lastfour', $data['lastfour']);
});
我正在尝试对新用户的注册添加验证约束,我希望两个字段的组合在数据库中是唯一的。我得到的错误来自数据库,说我违反了完整性约束。我拥有的 table 称为用户,我想要具有唯一组合的字段称为 ssn 和 lastfour。
我添加了行 $table->unique(array('ssn','lastfour'));在用户迁移中,我还在注册中添加了一些工作正常并且数据库正常的字段。我在大约 9 个月前发布的类似问题中尝试了该解决方案
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);
})
],
$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'],
]);
}
您也可以使用两个查询
$uniqueRule = Rule::unique('users')->where(function ($query) use ($data){
$query->where('ssn', $data['ssn']);
$query->where('lastfour', $data['lastfour']);
});