带有“或”条件的 Laravel 验证

Posted

技术标签:

【中文标题】带有“或”条件的 Laravel 验证【英文标题】:Laravel validations with "or" condition 【发布时间】:2020-06-03 18:15:37 【问题描述】:

我正在尝试在 Laravel 中使用有点复杂的“或”条件进行输入验证。

如果输入的值存在于特定表中或者其值为“其他”,我需要验证器来验证输入(让它通过)。

到目前为止,我有:

$validator = Validator::make($data, [

    ...

    'doc_organization' => ['required_with:rb_regist,doctor, exists:user_organizations,full_name'], // TODO: must exist in user_organizations table or be "other"
    'doc_custom_organization' => ['required_if:doc_organization,other', 'max:160'],

    ...

我看了一下 Laravel 的自定义验证规则,有条件地添加规则等等,还有这些帖子:

Laravel Validation with or

Validation rules required_if with other condition (Laravel 5.4)

但我似乎无法提出一个自定义规则,在该规则中我不会查询整个表以了解名称是否存在(以防它不是“其他”)。这会使规则过于复杂,无法达到目的。

我的另一个解决方案是在 user_organizations 表中添加一个名为“other”的条目,这并不理想。

我错过了什么吗? 如何在没有复杂的自定义验证规则的情况下创建我想要的条件?

非常感谢。

【问题讨论】:

不要从前面发送full_name,只发送ID。选项other 将不发送任何ID(空/空)。在这种情况下,使用存在就足够了。 【参考方案1】:

由于“其他”只是一个值而不是数据库中的记录,因此您可以简单地将其“扭曲”为以下内容:

'doc_organization' => ['nullable|required_with:rb_regist,doctor, exists:user_organizations,full_name'],

扭曲的是,在您的 Validator 之前,您可以简单地检查您请求的值,例如:

if($request->doc_organization == "other")
  $request->merge(['doc_organization' => null]);

并将null 值注入到请求中的字段中。

完成后,您将遵守允许您通过的“可空”选项。

【讨论】:

以上是关于带有“或”条件的 Laravel 验证的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 8 中添加带有 where 条件的验证规则?

Larave中CSRF攻击

带有参数的渴望加载 - laravel

方法验证不存在 - Laravel 5.4

Laravel中的信息验证 和 语言包

Laravel 在身份验证异常时自动重定向