Laravel 验证数组迭代

Posted

技术标签:

【中文标题】Laravel 验证数组迭代【英文标题】:Laravel validate array iterations 【发布时间】:2018-10-19 07:18:17 【问题描述】:

我通过 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"
  ]
]

【问题讨论】:

您没有为每个数组项指定哪些字段。例如。 'details.*.*.store' @ThomasMoors 即使​​我这样做'details.*.0',也没关系。 0 是一个字段吗?不需要'details.*.0'.quantity'quantity 字段应该出现在一个名为 details 的数组内的数组内的每个第 0 个项目上... @ThomasMoors,我不这么认为。如果你看一下 js 代码,你可以看到我正在创建一个关联数组。 您能告诉我们var_dump(json_decode($request-&gt;details)) 显示的内容吗? 【参考方案1】:

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

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 的 Custom Validation Rules

编辑

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

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

您应该改为 modify your input befor validation 和 Modify input before form request validation

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

【讨论】:

抱歉回复晚了。但是,它仍然无法正常工作 我认为它是一个对象而不是一个数组。你能告诉我如何验证一个对象吗? json_decode($request-&gt;details, true);将其转换为associative array

以上是关于Laravel 验证数组迭代的主要内容,如果未能解决你的问题,请参考以下文章

迭代数据时,Laravel 无法将 stdClass 类型的对象用作 Job 的数组 [重复]

Laravel 5 - 根据需要验证数组,但允许传递一个空数组

如何使用 proengsoft/laravel-jsvalidation 和 Laravel 5 验证数组输入

如何在 Laravel 中验证数组?

Laravel 数组:密钥验证

Laravel 仅验证已发布的项目并忽略验证数组的其余部分