我想使用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
规则以允许这种验证?还是任何其他方式允许这样做?
答案 0 :(得分:1)
您可以使用closure和collection来检查是否存在重复项(“已删除”项除外):
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'));
}
},
],
];
}