首页 > 解决方案 > Laravel 验证数组迭代

问题描述

我通过 javascript 从表单中发送了一个数组,该数组从不同的输入字段中获取值,然后将其存储在一个变量中。

<input type="hidden" name="details" id="details">

js

document.querySelectorAll('form')[1].addEventListener('submit', function(event) {
    var details = [];
    for (var i = 0; i < {{ $event->grocery->items()->count() }}; i++) {
        details[i] = [
            document.querySelectorAll('.store')[i].value,
            document.querySelectorAll('.item')[i].value,
            document.querySelectorAll('.quantity')[i].value,
            document.querySelectorAll('.brand')[i].value,
            document.querySelectorAll('.size')[i].value,
        ];
    }

    document.querySelector('#details').value = JSON.stringify(details);
});

然后在我的控制器中,我使用解码数组json_decode

$request->details = json_decode($request->details);

现在,我想验证每次迭代(只是检查它是否为空)。所以,我喜欢这样,

$request->validate([
    ...
    'details.*.*' => 'required'
]);

但我的问题是这没有做任何事情。即使我发送了一个空迭代,它也会继续而不返回错误。

我在这里做错什么了吗?请帮我。

更新

示例 var 转储详细信息

array:3 [▼
  0 => array:5 [▼
    0 => "Grocery"
    1 => "Grocery"
    2 => "Grocery"
    3 => "Grocery"
    4 => "Grocery"
  ]
  1 => array:5 [▼
    0 => "Grocery"
    1 => "Grocery"
    2 => "Grocery"
    3 => "Grocery"
    4 => "Grocery"
  ]
  2 => array:5 [▼
    0 => "Grocery"
    1 => "Grocery"
    2 => "Grocery"
    3 => "Grocery"
    4 => "Grocery"
  ]
]

标签: javascriptphparrayslaravelvalidation

解决方案


如果你命名你的数组值会更容易

document.querySelectorAll('form')[1].addEventListener('submit', function(event) {
    var details = [];
    for (var i = 0; i < {{ $event->grocery->items()->count() }}; i++) {
        details[i] = {
            store: document.querySelectorAll('.store')[i].value,
            item: document.querySelectorAll('.item')[i].value,
            quantity: document.querySelectorAll('.quantity')[i].value,
            brand:document.querySelectorAll('.brand')[i].value,
            size: document.querySelectorAll('.size')[i].value,
        };
    }

    document.querySelector('#details').value = JSON.stringify(details);
});

验证将如下所示:

$request->validate([
    ...
    'details.*.store' => 'required',
    'details.*.item' => 'required',
    'details.*.quantity' => 'required',
    'details.*.brand' => 'required',
    'details.*.size' => 'required'
]);

但如果它不适合你,总有 Laravel 的自定义验证规则

编辑

我认为问题可能在于您的数据更新:

$request->details = json_decode($request->details);

相反,您应该在验证之前修改输入并在表单请求验证之前修改输入

$request->request->set('details', json_decode($request->details));

推荐阅读