Laravel 6中$request->input()无法获取表单数组数据求助
问题根源分析
你的问题出在FormData转JSON的方式上。当前的formData()方法把表单字段的键(比如prices[type][1])直接作为字符串键存入对象,生成的JSON结构是平级的:
{ "prices[type][1]": "输入值1", "prices[type][2]": "输入值2" }
而Laravel的Request类解析JSON请求时,只会识别嵌套的对象/数组结构,不会自动把prices[type][1]这种字符串键解析成多维数组。这就是为什么$request->input('prices')拿不到数据,但$request->all()能看到所有平级键值对的原因。
解决方案:解析表单键为嵌套结构
你需要修改formData()方法,把带括号的表单键(比如prices[type][1])解析成嵌套的对象/数组。下面是实现代码:
formData(): Object { const formData = new FormData(this.$el); const parsedData = {}; Array.from(formData.entries()).forEach(([key, value]) => { // 拆分键为路径数组,比如"prices[type][1]"拆成["prices", "type", "1"] const keys = key.replace(/\]/g, '').split('['); let current = parsedData; // 逐层构建嵌套结构 for (let i = 0; i < keys.length; i++) { const k = keys[i]; // 如果是最后一个键,赋值 if (i === keys.length - 1) { current[k] = value; } else { // 如果当前层级不存在,初始化对象/数组(根据下一个键是否为数字判断) current[k] = current[k] || (isNaN(Number(keys[i+1])) ? {} : []); current = current[k]; } } }); return JSON.stringify(parsedData); }
这段代码会把表单字段转换成Laravel能识别的嵌套JSON结构:
{ "prices": { "type": [ null, // 因为表单索引从1开始,数组索引0会是空值,不影响Laravel解析 "输入值1", "输入值2" ] } }
验证效果
修改后,你就可以在Laravel中正常使用:
$prices = $request->input('prices'); // $prices会是一个数组:['type' => [null, '输入值1', '输入值2']] $typePrices = $request->input('prices.type'); // 获取type对应的数组
额外小提示
如果不想修改前端代码,也可以在Laravel端手动处理原始数据,但这种方式不如前端修正规范,仅作应急参考:
$allData = $request->all(); $prices = []; foreach ($allData as $key => $value) { if (str_starts_with($key, 'prices[')) { // 手动解析键并构建数组的逻辑 // 示例代码省略,推荐优先修改前端实现 } }
内容的提问来源于stack exchange,提问作者Robin B
相关产品推荐
相关产品推荐

