Laravel8使用Maatwebsite导出Excel报mapArraybleRow返回null错误如何解决
错误原因
getBatch方法未执行实际查询:当前返回的是DB查询构造器对象,没有调用get()方法获取真实数据行,即使外层套collect()也无法得到可序列化的数据集,导致Maatwebsite处理行数据时拿到空值。- 重复字段冲突:
headings方法中定义了2个重复的activation字段,getBatch的查询逻辑里定义了2个重复的variety_code字段,重复键会导致数组转换时数据丢失,出现null值。 - 接口实现缺失:你的
BatchExport类只实现了FromCollection接口,但是定义了headings方法的前提下,需要额外实现WithHeadings接口才会被扩展正确识别,否则可能触发数据解析异常。
修复步骤
1. 修正getBatch方法,补全查询执行逻辑,删除重复字段
public static function getBatch() { $records = DB::table('batch_upload')->select( 'bid', 'product_group', 'title_product_variety', 'product_code', 'variety_code', 'seller_code', 'activation', 'send_interval', 'sell_price', 'mortal_price', 'promotion_price', 'consumable_balance', 'reserve', 'seller_inventory', 'digikala_inventory', 'maximum_order_count' )->get(); // 新增get()执行查询 return $records; }
2. 修正BatchExport类,补全接口,删除重复表头,去掉多余collect包装
use Maatwebsite\Excel\Concerns\FromCollection; use Maatwebsite\Excel\Concerns\WithHeadings; // 引入表头接口 class BatchExport implements FromCollection, WithHeadings // 实现两个接口 { public function headings():array{ return [ 'Id', 'product_group', 'title_product_variety', 'product_code', 'variety_code', 'seller_code', 'activation', 'send_interval', 'sell_price', 'mortal_price', 'promotion_price', 'consumable_balance', 'reserve', 'seller_inventory', 'digikala_inventory', 'maximum_order_count' ]; // 去掉了重复的activation字段 } /** * @return \Illuminate\Support\Collection */ public function collection() { return BatchUpload::getBatch(); // get()已经返回集合,无需再套collect } }
3. 原有控制器和路由无需修改,重新访问接口即可正常导出。
内容的提问来源于stack exchange,提问作者user16753137
相关产品推荐
相关产品推荐

