laravel-使用required_without和required_if

时间:2019-10-08 10:33:40

标签: php laravel

如何创建验证表单的外观,如下所示:如果用户选择“旧车”单选按钮选项,则需要从dopdown选择列表中选择车名,然后不必填写其余字段。如果用户选择“新车”单选按钮选项,则他必须插入车名和编号。如果汽车没有编号,用户需要选中“无编号汽车”复选框,那么他只需要输入汽车名称即可。现在,它不如我所愿。

<form action="/action.php">
  <label for="exampleFormControlFile1">Cars:</label><br>
  <div id="option" role="radiogroup">          
  <input id="opt" type="radio" class="form-control form-control-sm" value="old" name="car" checked>Old car                  
 <input id="opt" type="radio" class="form-control form-control-sm" value="new" name="car">New car                  
 </div>
<div id="old_car">
{!! Form::select('car', $cars, null, ['class'=>'form-control form-control-sm form-control-chosen', 'placeholder' => 'Choose']) !!}
{!! $errors->first('bu', '<strong><p style="color:red;" class="help-block">:message</p></strong>') !!}
</div>
<div id="new_car">
<label for="exampleFormControlFile1">Car:</label><br>
<input class="form-control form-control-sm" name="name" type="text"><br>
<label for="exampleFormControlFile1">Car number:</label><br>
<input class="form-control form-control-sm" type="text" name="car_number" id="number"><br> 
{!! Form::checkbox('no_number', null, false,  ['class'=>'form-check-input', 'id'=>'car']); !!}
<label class="form-check-label" for="defaultCheck1">car without number</label>                
</div>              
<input type="submit" value="Submit">
</form>
class CarController

...

public function store(Request $request)
{
      $request->validate([            
            'car' => ['required_if:car,old', 'integer'],
            'name' => ['required_if:car,new', 'string'],
            'car_number' => ['required_if:car,new', 'required_without:no_number', 'unique:cars,c_number', 'digits_between:10,10'],

}

编辑 我忘了。现在,当我选择新车并发送完整的表格时,它在下拉列表中向旧车显示错误,该值必须为整数。

1 个答案:

答案 0 :(得分:0)

根据documentation,验证规则中的顺序很重要:

  

在首次验证失败时停止

     

有时您可能希望停止在   第一次验证失败后的属性。为此,请分配   该属性的保释规则:

$request->validate([
    'title' => 'bail|required|unique:posts|max:255',
    'body' => 'required', ]);
     

在此示例中,如果unique属性上的title规则失败,则   max规则将不会被检查。规则将按顺序验证   他们被分配了。

在您的情况下,第一个规则失败'required_if:car,new',,您选择了新车单选按钮,但没有为car_number提供值。

因此,要解决此问题,您只需颠倒规则的顺序即可:

public function store(Request $request)
{
      $request->validate([            
            'car' => ['required_if:car,old', 'integer'],
            'name' => ['required_if:car,new', 'string'],
            'car_number' => ['required_without:no_number', 'required_if:car,new', 
                             'unique:cars,c_number', 'digits_between:10,10'],
}