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

GRo*_*ing 6 php laravel laravel-5 laravel-validation laravel-5.4

我在Laravel 5.4工作,我有一个稍微具体的验证规则需要,但我认为这应该很容易实现,而不必扩展类.只是不知道如何使这项工作..

我想要做的是'music_instrument'如果program数组包含,则使表单字段成为必填字段'Music'.

我发现这个线程如何设置require如果在laravel验证中的另一个多选字段中选择了值?但它不是一个解决方案(因为它从来没有得到解决),并且它不起作用的原因是因为提交的数组索引不是常量(在索引提交结果时不考虑选中的复选框). ..)

我的情况如下:

<form action="" method="post">
    <fieldset>

        <input name="program[]" value="Anthropology" type="checkbox">Anthropology
        <input name="program[]" value="Biology"      type="checkbox">Biology
        <input name="program[]" value="Chemistry"    type="checkbox">Chemistry
        <input name="program[]" value="Music"        type="checkbox">Music
        <input name="program[]" value="Philosophy"   type="checkbox">Philosophy
        <input name="program[]" value="Zombies"      type="checkbox">Zombies

        <input name="music_instrument" type="text" value"">

        <button type="submit">Submit</button>

    </fieldset>
</form>
Run Code Online (Sandbox Code Playgroud)

如果我从复选框列表中选择一些选项,我可能会在我的$request值中得到这个结果

[program] => Array
    (
        [0] => Anthropology
        [1] => Biology
        [2] => Music
        [3] => Philosophy
    )

[music_instrument] => 'Guitar'
Run Code Online (Sandbox Code Playgroud)

在这里查看验证规则:https://laravel.com/docs/5.4/validation#available-validation-rules我认为像他这样的东西应该可以工作,但我实际上什么都没得到:

  $validator = Validator::make($request->all(),[
        'program'           => 'required',
        'music_instrument'  => 'required_if:program,in:Music'
  ]);
Run Code Online (Sandbox Code Playgroud)

我希望这也能奏效,但没有运气:

'music_instrument'  => 'required_if:program,in_array:Music',
Run Code Online (Sandbox Code Playgroud)

思考?建议?

谢谢!

Mar*_*łek 15

没有尝试过,但是在一般的数组字段中,你通常会这样编写:program.*,所以这样的东西可能会起作用:

  $validator = Validator::make($request->all(),[
        'program'           => 'required',
        'music_instrument'  => 'required_if:program.*,in:Music'
  ]);
Run Code Online (Sandbox Code Playgroud)

如果它不起作用,显然你也可以用另一种方式做到这一点,例如:

$rules = ['program' => 'required'];

if (in_array('Music', $request->input('program', []))) {
    $rules['music_instrument'] = 'required';
}

$validator = Validator::make($request->all(), $rules);
Run Code Online (Sandbox Code Playgroud)

  • 我会接受您的第二个解决方案,因为这就是我的方式:) 谢谢!为了争论,如果其他人提出了一个开箱即用的工作配置,我仍然希望看到它......呵呵 (2认同)

nul*_*sce 13

我知道这篇文章比较旧,但如果有人再次遇到这个问题。

$validator = Validator::make($request->all(),[
    'program' => 'required',
    'music_instrument'  => 'required_if:program,Music,other values'
]);
Run Code Online (Sandbox Code Playgroud)