Laravel中使用Maatwebsite Excel包关联User与Clients表导出Excel时的array_values参数错误修复方案
解决Laravel中Maatwebsite Excel导出关联数据时的对象转数组错误
看起来你在导出User和Clients关联数据时遇到了类型不匹配的问题——报错说array_values()期望参数是数组,但实际传入的是对象,我来帮你一步步修复这个问题:
错误原因分析
你的控制器里Client::get()返回的是Eloquent模型对象的集合,每个元素都是Client实例,而不是普通数组。但你在ClientsExport类里直接把这些对象当作数组来处理(比如array_keys($array[0])、array_values($row)),这就导致了类型错误。另外,你原来的Export类逻辑是为了处理多个独立数据集(比如注释里的三级数组),但现在实际传入的是单个查询结果的集合,循环逻辑也不匹配。
修复方案(两种可选)
方案一:将查询结果转为数组后传入Export类
修改控制器的export方法,在get()后调用toArray(),把Eloquent集合转为二维数组:
public function export() { $arrays = Client::select('clients.*','users.*') ->join('users', 'users.id', '=', 'clients.user_id') ->where('users.type', '=', 'client') ->get() ->toArray(); // 新增这一行,将模型集合转为数组 return Excel::download(new ClientsExport($arrays), 'clients.xlsx'); }
然后调整ClientsExport类的构造函数,适配单个二维数组的处理:
class ClientsExport implements FromCollection { /** * @return \Illuminate\Support\Collection */ private $collection; public function __construct($data) { $output = []; if (!empty($data)) { // 添加表头:取第一行数据的键作为表头 $output[] = array_keys($data[0]); // 遍历每一行,添加数据值 foreach ($data as $row) { $output[] = array_values($row); } // 如果需要在数据末尾加空行可以保留,否则删除下面这行 // $output[] = ['']; } $this->collection = collect($output); } public function collection() { return $this->collection; } }
方案二:直接处理Eloquent模型对象(不转数组)
如果你不想转数组,也可以在Export类里把模型对象转为数组处理,控制器代码保持不变,只修改ClientsExport:
class ClientsExport implements FromCollection { /** * @return \Illuminate\Support\Collection */ private $collection; public function __construct($data) { $output = []; if (!$data->isEmpty()) { // 取第一个模型对象转数组后,拿键作为表头 $output[] = array_keys($data->first()->toArray()); // 遍历每个模型对象,转数组后取值 foreach ($data as $row) { $output[] = array_values($row->toArray()); } } $this->collection = collect($output); } public function collection() { return $this->collection; } }
额外提示
如果你需要导出多个独立的数据集(比如原来注释里的三级数组),那你需要确保传入ClientsExport的是多个数组组成的数组,然后再恢复原来的多数据集循环逻辑,但目前你的场景是单个关联查询结果,所以上面的修改就足够解决问题了。
内容的提问来源于stack exchange,提问作者kumari shwetha
相关产品推荐
相关产品推荐

