Laravel 表单验证唯一使用 2 个字段

2021-12-18 00:00:00 php laravel-5

如何在 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.

相关文章