首页 > 解决方案 > Laravel 5.7 验证带星号的字段,required_if

问题描述

我有一个 Vue 表单,可以让用户为那里的个人资料添加工作经验。用户可以通过单击按钮添加额外的体验。单击该按钮将添加一个带有新输入字段的新项目。我无法添加整个脚本,因为它已经很大了。但这里有一个例子给你一个想法:

<div class="item">
    <div class="row">
        <div class="form-group col-md-6">
            <label class="form-label">Title</label>
            <input type="text" name="experiences[0][title]" class="form-control">
        </div>
        <div class="form-group col-md-6">
            <label class="form-label">Institution</label>
            <input type="text" name="experiences[0][institution]" class="form-control">
        </div>
    </div>
    <div class="row">
        <div class="col-md-12">
            <textarea name="experiences[0][comments]" class="form-control"></textarea>
        </div>
    </div>
</div>
<div class="item">
    <div class="row">
        <div class="form-group col-md-6">
            <label class="form-label">Title </label>
            <input type="text" name="experiences[1][title]" class="form-control">
        </div>
        <div class="form-group col-md-6">
            <label class="form-label">institution </label>
            <input type="text" name="experiences[1][institution]" class="form-control">
        </div>
    </div>
    <div class="row">
        <div class="col-md-12">
            <textarea name="experiences[1][comments]" class="form-control"></textarea>
        </div>
    </div>
</div>

每个元素后都有一个按钮来添加新行。这工作正常,但我有一些验证问题。如果其中一个字段有值,我只想验证这些字段。例如:如果experiences[0][institution]有一个值,experiences[0][title]并且experiences[0][comments]是必需的。这必须在每个订单中都有效。如果title有值,则需要其他字段。我真的无法找到一种方法来验证这一点。这是我的验证规则:

$this->validate(request(), [
        'experiences.*.title'       => 'required_if:experiences.*.institution,null',
        'experiences.*.institution' => 'required_if:experiences.*.title,null',
]);

这里的问题是它根本无法验证。我不知道如何制定一条规则,如果字段 X 有值,则需要 Y 和 Z。

希望这里的任何人都可以帮助我找到解决方案!:)

标签: phplaravelvue.jslaravel-5.7

解决方案


就像 Azeame 所说,制定一个自定义验证规则并检查所有值是否已填充或全部为空。在德行的东西:

public function passes($attribute, $value)
{
    $required = ['title','institution','comments'];

    $experience = collect($value)->reject(function ($item, $key) {
        return empty($item);
    });

    if (count($experience) == 0) {
        return true;
    }

    foreach ($required as $field) {
        if ( !$experience->has($field)) {
            return false;
        }
    }

    return true;
}

也许有更好的方法,但这应该可行。


推荐阅读