Laravel验证规则如果字段为空,则需要另一个字段

Mar*_*rco 7 php validation laravel

我有一个Laravel 5.3应用程序和一个更新表单,我发送用户配置文件值.其中一个是用户图像,我正在为它创建一个隐藏的输入字段,所以如果用户没有上传任何新图像,我仍然可以看到他有隐藏字段和旧图像值.

<input type="hidden" class="form-control" name="old_image" value="{{ $player->image_filename }}" id="oldImage">
Run Code Online (Sandbox Code Playgroud)

如果他删除图像,隐藏的输入值将变为空.

document.getElementById('oldImage').value = '';
Run Code Online (Sandbox Code Playgroud)

这就是我想到的更新用户图像的方法.但我不知道如何为该表单设置验证规则.与此类似的东西:

    public function rules()
    {
        return [
          'first_name' => 'required|max:50',
          'last_name' => 'required|max:50',
          'birthday' => 'required',
          'image' => required if old_image empty
        ];
    }
Run Code Online (Sandbox Code Playgroud)

我已尝试过,但'image' => 'required_without:old_image','image' => 'required_if:old_image, null',没有显示任何错误信息丢失图像.我正在显示如下错误消息:

Ric*_*alo 14

您可以使用两个规则

'image' => 'required_if:old_image,' // yes, nothing after comma
Run Code Online (Sandbox Code Playgroud)

要么:

'image' => 'required_without:old_image,'
Run Code Online (Sandbox Code Playgroud)

  • 不再起作用:验证规则 required_if 需要至少 2 个参数 (13认同)
  • Atm (Laravel 8) `required_if:x,null` 与 `required_without:x` 不同 (3认同)

M.a*_*man 11

对于新的laravel版本,如果需要使用required_if,它至少需要两个参数,所以应该使用第二个和第三个参数作为if条件。

  'old_image'=>'required_if:image,=,null',
  'image'=>'required_if:old_image,=,null'
Run Code Online (Sandbox Code Playgroud)

  • 使用 required_unless:old_image,null (4认同)
  • 'required_if:old_image,!=,null' 不起作用.. (2认同)

小智 6

这可以通过required_without规则来完成,如果它不起作用,请显示实际的样本请求数据(dd(request()->all() ))和您正在使用的验证规则.您想要捕获的方案很简单:如果两个字段都为空.

在您的示例中,应用此规则应该有效:

return [
          // ...
          'image' => 'required_without:old_image'
        ];
Run Code Online (Sandbox Code Playgroud)

required_without:FOO,酒吧,...

验证字段必须存在,并且仅当不存在任何其他指定字段时才为空. 验证 - Laravel 5.3

例:

$rules = [
        'new_value' => 'required_without:old_value'
        ];

validator(
        ['new_value' =>'',
        'old_value' => 'old value is preserved here']
    , $rules)->errors()->toArray();

// output: [] <-- no errors!

validator(
        ['new_value' =>'New value!',
        'old_value' => '']
    , $rules)->errors()->toArray();

// output: [] <-- no errors!

validator(
        ['new_value' =>'',
        'old_value' => '']
    , $rules)->errors()->toArray();

// output: ["new_value" => ["The new value field is required when old value is not present."]]
Run Code Online (Sandbox Code Playgroud)


sou*_*ngh 5

用这个

'image'=>'required_if:old_image,=,null'
Run Code Online (Sandbox Code Playgroud)


Ref*_*lon 5

我知道这是一个老问题,但我在搜索过程中遇到了它。因此,我也会在这里发布我的解决方案,以供未来的访客使用。

我认为这个解决方案正是OP想要的。该解决方案不使用其他包或自定义验证方法,因此在我看来这也是一个优点。

我所做的是这样的:

public function rules()
{
    return [
      'first_name' => ['required', 'max:50'],
      'last_name' => ['required', 'max:50'],
      'birthday' => ['required'],
      'old_image' => ['nullable'],
      'image' => [
          Rule::requiredIf(function() {
              return empty($this->request->get('old_image'));
          })
      ]
    ];
}

Run Code Online (Sandbox Code Playgroud)


Ram*_*ood 1

尝试这个

if (empty($request->input('old_image'))){
     $this->validate($request, [
       'image' => 'required',
     ]);
}
else {
     // Validation in case of else goes here
     $this->validate($request, [
      // rule
     ]);
}
Run Code Online (Sandbox Code Playgroud)

  • 有一个 Laravel 包装器用于此目的;[`$request-&gt;has('old_image')`](https://laravel.com/docs/5.1/requests#retriving-input) (3认同)