Laravel Export报错:尝试读取null的second_key属性
解决Laravel Export导出时"Attempt to read property 'second_key' on null"异常
问题场景
使用Laravel Export导出数据时,代码抛出ErrorException: Attempt to read property "second_key" on null异常,相关代码如下:
<?php namespace App\Admin\Extensions; use Encore\Admin\Grid\Exporters\ExcelExporter; use Maatwebsite\Excel\Facades\Excel; use Maatwebsite\Excel\Concerns\FromQuery; use Maatwebsite\Excel\Concerns\WithMapping; use Maatwebsite\Excel\Concerns\ShouldAutoSize; class DataExporter extends ExcelExporter implements FromQuery, WithMapping, ShouldAutoSize { protected $fileName = 'Export Data.xlsx'; public function headings(): array { return [ 'ID', 'Title', 'Status', 'Gender', 'Data', ]; } public function map($data): array { return [ $data->id, $data->title, $data->status, $data->gender, $data->json_data->second_key, // <-- 报错位置 ]; } }
排查结果
- 执行
print_r(json_encode($data->json_data)),输出显示json_data字段包含second_key及对应值 - 直接返回
$data->json_data到Excel单元格时,能正常显示完整JSON内容,但访问$data->json_data->second_key时触发异常
解决方案
方案1:手动转换JSON字符串为对象/数组
在map方法中先将JSON字符串转换为对象或数组,同时处理可能的空值情况:
public function map($data): array { // 将JSON字符串转为对象,若需要数组则第二个参数传true $jsonData = json_decode($data->json_data); return [ $data->id, $data->title, $data->status, $data->gender, // 使用null安全运算符避免空值报错,空合并运算符设置默认值 $jsonData?->second_key ?? '', ]; }
方案2:利用Laravel模型字段自动转换
在对应的数据模型中,通过$casts属性将json_data字段自动转换为对象或数组:
// 对应的数据模型类 class YourModel extends Model { protected $casts = [ 'json_data' => 'object', // 或 'array',根据需求选择 ]; }
设置后,从数据库取出数据时json_data会自动转为对象/数组,此时可直接访问属性,但仍建议保留空值处理:
$data->json_data?->second_key ?? ''
原因说明
直接返回$data->json_data能显示完整JSON,是因为Laravel会自动将字符串类型的JSON字段转为可打印的内容,但此时该字段本质仍是字符串而非对象/数组。尝试用对象属性访问符->读取字符串的"属性"时,PHP会将字符串视为非对象类型,进而触发"读取null属性"的异常。
内容的提问来源于stack exchange,提问作者Fhadilah Muchsin
相关产品推荐
相关产品推荐

