使用Laravel“独特”验证规则,但忽略基于数组属性的某些数组条目

时间:2019-07-10 20:18:01

标签: arrays laravel validation laravel-5 distinct

我想使用Laravel中的Form Request验证输入数据数组。 数组如下所示:

[
  'issues' =>
  [
     'type' => 'prio_1',
     'note' => 'This is some text'
  ],
  [
     'type' => 'prio_2',
     'note' => 'This is some other text'
  ]
  [
     'type' => 'prio_1',
     'note' => 'This is yet some other text',
     'deleted' => true
  ]
]

考虑到第三个数组条目为type,因此我想验证此数组中的distinct字段是deleted,因此对于此规则需要忽略。 使用

["issues.*.type" => 'required|distinct']

当然不起作用,因为在数组属性具有特定值的情况下,无法将此规则参数化以忽略该规则。 过滤输入内容以删除已删除的条目也不是一种选择,因为替换响应中的*的索引需要与请求中的原始索引匹配。

是否有一种方法(使用自定义验证器)扩展distinct规则以允许这种验证?还是任何其他方式允许这样做?

1 个答案:

答案 0 :(得分:1)

您可以使用closurecollection来检查是否存在重复项(“已删除”项除外):

public function rules()
{
    return [
        "issues.*.type" => [
            'required', function ($attr, $value, $fail) {
                $count = collect($this->input('issues'))
                    ->reject(function ($item) {
                        return isset($item['deleted']) && $item['deleted'];
                    })
                    ->filter(function ($item) use ($value) {
                        return $item['type'] === $value;
                    })
                    ->count();

                if ($count > 1) {
                    $fail(__('validation.distinct'));
                }
            },
        ],
    ];
}

为使事情更有效率,您还可以只计算之前的值,然后检查计数是否大于一个:

public function rules()
{
    $duplicateTypes = collect($this->input('issues'))
        ->reject(function ($item) {
            return isset($item['deleted']) && $item['deleted'];
        })
        ->groupBy('type')
        ->map->count();

    return [
        "issues.*.type" => [
            'required', function ($attr, $value, $fail) use($duplicateTypes) {
                if ($duplicateTypes[$value] > 1) {
                    $fail(__('validation.distinct'));
                }
            },
        ],
    ];
}