Laravel仅在值不为null时验证字段的唯一性



我有一个可以为null的system_name字段,如果输入不为null,我想验证该字段的唯一性。

根据其他人给出的推荐解决方案,它可以只是

$this->validate($request, [
'system_name' => 'nullable|unique:systems'
]);

为什么这个解决方案有效?考虑到当为system_name输入null值时,它是否应该通过可为null的规则,但不通过唯一规则,因为null值不是唯一的,因为它以前曾被使用过?

我还可以询问用"与[]封装规则之间的区别吗?如在用户名和电子邮件上进行的验证所示

public function rules()
{
return [
'username' => 'required|min:8',
'email' => ['required', Rule::unique('users')]
];
}

nullable规则的文档简单地说明:

正在验证的字段可能是null

它没有声明,如果字段是null,则忽略后续验证。因此,在您的情况下,不会调用unique:systems规则。从逻辑角度来看,这是有道理的,因为nullable列/索引不应将null视为唯一值1

此外,'nullable|unique:systems'['nullable', 'unique:systems'](或其他变体(之间的区别是:实际上什么都没有。在Laravel的旧版本中,'rule1|rule2'语法是唯一可用的方法。比较Laravel 5.4和Laravel 6.x:的文档

https://laravel.com/docs/5.4/validation#basic-用法https://laravel.com/docs/6.x/validation#basic-使用

6.x版本包括:

或者,验证规则可以指定为规则数组,而不是单个由|分隔的字符串

如今,这两种语法都是可以接受的,主要是为了支持旧版本的向后兼容性和语法偏好。我喜欢|分隔的字符串,但[]方法更灵活一些(因为您可以使用文档中的一些示例中所示的规则和函数(


1通常;这可能不适用于所有DB类型,但根据我的经验,情况就是这样。

最新更新