如果字段为空,如何忽略验证规则?

Posted

技术标签:

【中文标题】如果字段为空,如何忽略验证规则?【英文标题】:How to ignore a validation rule if a field is null? 【发布时间】:2019-12-16 18:37:33 【问题描述】:

我有 2 个日期的这些规则。但我希望只有在输入了retired_on 日期时才遵循 before_or_equal 规则。我该怎么做呢?有时不能解决这个问题。如果没有输入retired_on 日期,则必须能够输入entered_on 而不会出现任何错误。使用这两条规则,由于retired_on 默认为空白,因此一开始就会出现错误。

'entered_on' => 'required|date_format:Y/m/d|before_or_equal:retired_on',
'retired_on' => 'date_format:Y/m/d|after_or_equal:entered_on',

【问题讨论】:

我使用的是 Laravel 5.1。此版本中不存在可空规则。我是什么做的?我无法升级,因为这是一项工作而不是个人项目。 【参考方案1】:

使用nullable 规则:

'retired_on' => 'nullable|date_format:Y/m/d|after_or_equal:entered_on',

【讨论】:

我添加了可以为空的规则,结果是“哎呀,好像出了点问题”。现在总是显示。 @Lorenz 你确定数据库中的retired_on 已经可以为空了吗? :) 我查看了迁移,是的,retired_on 与 enter_on 一起可以为空。 顺便说一句,我使用的是 Laravel 5.1,而我使用的 after_or_equal 和 before_or_equal 来自自定义的验证器。 我在看 Laravel 5.1 教程,确实没有可以为空的规则。看来我不能使用可为空的规则。有没有办法做到这一点?【参考方案2】:

既然你说你不能使用 nullable 或升级 Laravel 版本,你总是可以将它分开并有条件地验证该字段。

// your other input validations
$this->validate($request, [
    'entered_on' => 'required|date_format:Y/m/d|before_or_equal:retired_on',
]);

// only validate 'retired_on' if it exists and is not null
if ($request->has('retired_on') && !is_null($request->input('retired_on'))) 
    // pre-check passed, do validation
    $this->validate($request, [
        'retired_on' => 'date_format:Y/m/d|after_or_equal:entered_on',
    ]);

【讨论】:

感谢您花时间编写代码!非常感谢。

以上是关于如果字段为空,如何忽略验证规则?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 验证规则 - 要求字段显式为空,具体取决于另一个字段的值 (type_id)

如何在 laravel 8 中为 API 返回验证规则和消息作为 JSON

Yii2 rules验证规则

如果值存在于另一个字段数组中,Laravel 验证规则

表单验证规则---antd

yii2 model常用验证规则