导出Excel排除指定字段报错:Method Illuminate\Database\Eloquent\Collection::getAttributes不存在
导出Excel排除指定字段时的报错解决
需求
导出Excel时不返回某些指定字段
报错信息
Method Illuminate\Database\Eloquent\Collection::getAttributes does not exist.,报错行:$attributes = $customer->getAttributes();
相关代码
CustomerExport.php
<?php namespace App\Exports; use App\Models\CustomerModel; use Maatwebsite\Excel\Concerns\FromCollection; use Maatwebsite\Excel\Concerns\WithHeadings; class CustomerExport implements FromCollection, WithHeadings { protected $id; public function __construct($id) { $this->id = $id; } public function collection() { $customer = CustomerModel::find($this->id); // 定义需要排除的字段 $excludeAttributes = ['id', 'column1', 'column2']; // 获取除排除字段外的所有属性 $attributes = $customer->getAttributes(); $filteredAttributes = array_diff_key($attributes, array_flip($excludeAttributes)); // 将过滤后的属性包装为集合 $collection = collect([$filteredAttributes]); return $collection; } public function headings(): array { return [ 'Name', 'Age', 'Height', 'Weight', ]; } }
CustomerModel.php
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class CustomerModel extends Model { use HasFactory; protected $table = "customers"; protected $primaryKey = 'id'; protected $fillable = [ 'name', 'age', 'height', 'weight', ]; }
问题原因
find($id)未找到对应记录时会返回null,若传入数组形式的ID则返回Collection集合,而getAttributes()是Eloquent模型实例独有的方法,集合或null调用该方法必然触发报错。- 即使成功获取模型实例,当前的字段过滤逻辑也可优化为更贴合Laravel的惯用写法。
修复方案
方案一:直接指定需要导出的字段(推荐)
相比排除字段,直接声明需要导出的字段更直观,还能确保与表头完全对应:
public function collection() { // 找不到记录时抛出404异常,也可根据业务需求返回空集合 $customer = CustomerModel::findOrFail($this->id); // 仅保留需要导出的字段,与表头顺序对应 $filteredAttributes = $customer->only(['name', 'age', 'height', 'weight']); return collect([$filteredAttributes]); }
方案二:保留排除字段逻辑,先校验模型实例
如果必须使用排除字段的方式,先确保拿到的是模型实例:
public function collection() { $customer = CustomerModel::find($this->id); // 校验是否为模型实例,否则返回空集合 if (!$customer instanceof CustomerModel) { return collect(); } $excludeAttributes = ['id', 'column1', 'column2']; $attributes = $customer->getAttributes(); $filteredAttributes = array_diff_key($attributes, array_flip($excludeAttributes)); return collect([$filteredAttributes]); }
注意事项
确保headings()返回的表头顺序,与过滤后数组的键名顺序完全匹配,避免导出的Excel出现表头与数据错位的问题。
内容的提问来源于stack exchange,提问作者Cobit
相关产品推荐
相关产品推荐

