PHP中如何将函数返回的长数组拆分为子数组并解决Laravel插入报错
问题原因
你现在的写法给insert()方法传入了三维数组,但Laravel的查询构造器insert()方法只接受二维数组作为参数:
- 你拆分的每个方法
firstMethodToReturnPartOfArray()返回的本身就是[ [记录1], [记录2]... ]格式的二维数组 - 你把这些返回值直接放在
insert()的参数数组里,最终传入的参数结构就变成了[ [ [记录1], [记录2]... ], [ [记录3], [记录4]... ]... ]的三维结构,Laravel尝试把内层的数组作为字段值处理时就触发了数组转字符串的报错。
修复方案
方案1:合并所有分段数组后一次性插入(推荐)
用array_merge()把所有小方法返回的数组合并为一个符合要求的二维数组,再传给insert():
public function run() { DB::table('table_name')->insert( array_merge( $this->firstMethodToReturnPartOfArray(), $this->secondMethodToReturnPartOfArray(), // 其他返回数组的方法 $this->nthMethodToReturnPartOfArray() ) ); }
如果你使用PHP 7.4及以上版本,也可以用数组展开运算符写法:
public function run() { DB::table('table_name')->insert([ ...$this->firstMethodToReturnPartOfArray(), ...$this->secondMethodToReturnPartOfArray(), ...$this->nthMethodToReturnPartOfArray() ]); }
方案2:每个小方法内单独执行插入
也可以直接在每个拆分的方法里调用insert()插入对应分段的数据:
public function run() { $this->insertFirstBatch(); $this->insertSecondBatch(); // 其他批次插入方法 } public function insertFirstBatch() { DB::table('table_name')->insert([ [first_record], [second_record], // 对应批次的其他记录 ]); } // 其他批次方法逻辑同理
内容的提问来源于stack exchange,提问作者mohammad rostami siahgeli
相关产品推荐
相关产品推荐

