You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 01:22:41