Laravel 仅当值不为空时才验证字段的唯一性

Laravel validating the uniqueness of a field only when the value is not null

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

根据别人给出的推荐方案,可以

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

为什么这个解决方案有效?鉴于当为 system_name 输入空值时,它不应该通过可空规则但不符合唯一规则,因为空值不是唯一的,因为它以前被使用过?

请问用''和[]封装规则有什么区别?如对用户名和电子邮件所做的验证所示

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

nullable 规则的 documentation 简单地说明:

The field under validation may be null.

它没有说明的是,如果该字段是 null,则后续验证将被忽略。因此,在您的情况下,不会调用 unique:systems 规则。从逻辑的角度来看,这是有道理的,因为 nullable column/index 不应将 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-usage https://laravel.com/docs/6.x/validation#basic-usage

6.x版本包括:

Alternatively, validation rules may be specified as arrays of rules instead of a single | delimited string

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


1 通常;这可能不适用于所有数据库类型,但根据我的经验,情况确实如此。