问题描述
如何在 2 个字段上设置唯一的验证规则?
How can I have a unique validation rule on 2 fields?
一个.应用程序不应允许两个人具有相同的名字和姓氏.
a. The application should not allow two people to have the same identical first name and last name.
允许用户只填写名字或只填写姓氏.因为用户可能只有其中之一.
It is allowed that the users fills in only a first name or only a last name. Because the user may have only one of them.
B.但是,如果用户只输入名字 (Glen),则表中的其他人不应具有相同的名称(名字 = 'Glen' 且姓氏 = null).另一个格伦史密斯"还可以.
b. But if the user enters only a first name (Glen), no other person in the table should have the same (first name = 'Glen' and last name = null). another 'Glen Smith' ok.
我尝试了以下规则.当两个字段(名字和姓氏)都不为空时,它工作得很好:
I tried the following rule. It works great when both fields (first and last name) are not null:
'firstName' => 'unique:people,firstName,NULL,id,lastName,' . $request->lastName
此规则在 b 上失败.当只有一个字段时.
This rule fails on b. when only one field is present.
有什么提示吗?
推荐答案
内置的 unique
验证器不会真正支持您尝试执行的操作.它的目的是确保单个有效值在数据库中是唯一的,而不是两个值的组合.但是,您可以创建一个自定义验证器:
The built in unique
validator wouldn't really support what you're trying to do. It's purpose is to ensure that a single valid is unique in the database, rather than a composite of two values. However, you can create a custom validator:
Validator::extend('uniqueFirstAndLastName', function ($attribute, $value, $parameters, $validator) {
$count = DB::table('people')->where('firstName', $value)
->where('lastName', $parameters[0])
->count();
return $count === 0;
});
然后您可以通过以下方式访问此新规则:
You could then access this new rule with:
'firstName' => "uniqueFirstAndLastName:{$request->lastName}"
您可能会发现您可能需要稍微调整您的数据库查询,因为它未经测试.
You'll probably find you might need to tweak your database query a little bit as it's untested.
这篇关于Laravel 表单验证唯一使用 2 个字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!