2017-02-08 61 views
7

如何在2个字段上拥有唯一的验证规则?使用2个字段的Laravel表单验证唯一

a。应用程序不应该允许两个人具有相同的名字和姓氏。

允许用户只填写名字或只填写姓氏。因为用户可能只有其中一个。

b。但是如果用户只输入第一个名字(Glen),那么表格中的其他人不应该有相同的名字(名字='Glen'和姓氏=空)。另一个'格伦史密斯'确定。

我尝试了以下规则。当两个字段(名字和姓氏)都不为空时,它很好用:

'firstName' => 'unique:people,firstName,NULL,id,lastName,' . $request->lastName 

此规则在b上失败。当只有一个字段存在时。

任何提示?

回答

7

内置的unique验证器不会真的支持你想要做的事情。目的是确保数据库中的单个有效数据是唯一的,而不是两个值的组合。但是,您可以创建一个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; 
}); 

然后,您就可以访问这个新的规则:

'firstName' => "uniqueFirstAndLastName:{$request->lastName}" 

你可能会发现你可能需要调整你的数据库查询一点点,因为它是未经测试。

+1

开箱即可使用:) 非常感谢! – Warrio

+1

当验证更新表单时,我们需要通过增加一个额外的where子句来排除当前记录: - > where('id','<>',$ parameters [1]) 并且像这样调用它 ' firstName'=>“uniqueFirstAndLastName:{$ request-> lastName},{$ request-> id}” – Warrio