Laravel for循环批量入库报count()参数需为数组/可计数对象错误
报错原因
触发count(): Parameter must be an array or an object that implements Countable报错的核心原因有两点,代码还附带一个易忽略的语法错误:
- 后端获取到的
$request->degree不是数组或可计数类型:要么是前端没有按数组格式提交degree字段,要么是请求里未携带该字段,直接传入count函数就会触发类型错误 - 代码中读取数组元素的语法错误:
$request->degree[i]遗漏了PHP变量前缀$,正确写法应该是$request->degree[$i],就算count部分不报错,这行也会触发常量未定义的错误 - 未做参数长度校验:
clg、yoc字段如果长度和degree不一致,循环时会出现下标越界问题
修复方案
- 调整前端表单字段命名,确保三个提交字段均为数组格式,同组数据索引对应:
<!-- 教育经历表单组示例,每新增一组学历就复制一份该结构 --> <div> <input name="degree[]" placeholder="请输入学历"> <input name="clg[]" placeholder="请输入毕业院校"> <input name="yoc[]" placeholder="请输入毕业年份"> </div>
- 修正后端控制器代码,增加参数校验,修复语法错误:
// 先做参数合法性校验,从根源避免类型错误 $validated = request()->validate([ 'degree' => 'required|array', 'clg' => 'required|array|size:'.count(request()->input('degree', [])), 'yoc' => 'required|array|size:'.count(request()->input('degree', [])), 'degree.*' => 'required|string|max:50', 'clg.*' => 'required|string|max:100', 'yoc.*' => 'required|integer|digits:4', ]); $degreeList = $validated['degree']; for ($i = 0; $i < count($degreeList); $i++) { $edu = new Education(); $edu->degree = $degreeList[$i]; $edu->clg = $validated['clg'][$i]; $edu->yoc = $validated['yoc'][$i]; $edu->save(); } // 数据量较大时可替换为批量插入,减少数据库交互次数提升性能 // $insertArr = []; // foreach ($degreeList as $key => $degree) { // $insertArr[] = [ // 'degree' => $degree, // 'clg' => $validated['clg'][$key], // 'yoc' => $validated['yoc'][$key], // 'created_at' => now(), // 'updated_at' => now(), // ]; // } // Education::insert($insertArr);
注意:Laravel模型类名遵循大驼峰命名规范,
education模型建议命名为Education,符合框架约定可以避免很多不必要的配置问题。
内容的提问来源于stack exchange,提问作者hjking01072003
相关产品推荐
相关产品推荐

