Laravel验证可以为空或数字

时间:2019-08-08 09:15:58

标签: validation laravel-5

我正在使用Laravel 5.4。

我有两种形式的字段: travel_km和travel_rate

  1. 两个字段都必须是数字
  2. 两个字段都是可选的,但是,如果travel_km不为空,则必须输入travel_rate

我的规则:     'travel_km'=>'数字|可为空',     'travel_rate'=>'有时| required_with:travel_km'

问题是,如果travel_km为空,因为它为空,我仍然会收到travel_rate的错误。

如果我将travel_rate设为可空值,即使travel_km不为空,我也不会收到错误消息。

为了解决这个问题,我在控制器中做到了:

if(empty($request->travel_km) && empty($request->travel_rate)) {
        $this->validate($request,
        [
            'customer_id' => 'required',
            'service_date' => 'required',
            'labour_hrs'    => 'numeric|nullable',
            'hourly_rate' => 'sometimes|required_with:labour_hrs',
        ],
        [
            'customer_id' => 'Please enter the customer',
            'service_date' => 'Please select the service date',
            'labour_hrs' => 'Please enter a valid number',
            'hourly_rate' => 'Please enter a valid number',
        ]);
       } else {
        $this->validate($request,
        [
            'customer_id' => 'required',
            'service_date' => 'required',
            'labour_hrs'    => 'numeric|nullable',
            'hourly_rate' => 'sometimes|required_with:labour_hrs',
            'travel_km' => 'numeric|nullable',
            'travel_rate' => 'sometimes|required_with:travel_km'
        ],
        [
            'customer_id' => 'Please enter the customer',
            'service_date' => 'Please select the service date',
            'labour_hrs' => 'Please enter a valid number',
            'hourly_rate' => 'Please enter a valid number',
            'travel_rate' => 'Please enter a valid number',
            'travel_km' => 'Please enter a valid number'
        ]);
    }

还有其他解决方法吗?如果有少数情况,我会遇到这个问题,并且我不想采用更通用的解决方案。

我查看了“自定义验证”,但不明白如何检查travel_km是否为空。

Validator::extend('foo', function ($attribute, $value, $parameters, $validator) {
        return is_numeric($value) && $parameter ????;
    });

谢谢

1 个答案:

答案 0 :(得分:2)

尝试如下使用required_if

'travel_km' => 'numeric|nullable', 
'travel_rate' => 'sometimes|required_if:travel_km'

仅当travel_km存在且为非空时,这将验证travel_rate。在这里, 允许您将travel_km设置为空 如果travel_km不为空,而travel_rate为空,则当travel_km为空值时将显示错误,但不会显示错误。 希望这会有所帮助。

更新:nullable验证不适用于数值。

可以通过应用以下条件规则来完成

if( !empty(Input::get('travel_km')) ){
  $rules['travel_km'] = 'numeric';
}