Laravel日志可输出值,但页面报「Attempt to read property on null」错误
问题:Eloquent关联查询日志正常输出但页面报错
我尝试在Laravel模型间进行Eloquent关联查询时,页面报错,但日志中能正常输出sectorId的值,这些ID在sectors表中都存在。
控制器代码
$processedMaterialOrders = ProcessedMaterialOrder::get(); $sessionVariables = Session::all(); // Log::channel('ecom')->info($processedMaterialOrders); $filteredProcessedMaterials = []; foreach ($processedMaterialOrders as $key => $processedMaterialOrder) { // Log::channel('ecom')->info($processedMaterialOrder); $sectorId = $processedMaterialOrder->process->sector->id; Log::channel('ecom')->info($sectorId);
模型关联
ProcessedMaterial模型
public function process(): BelongsTo { return $this->belongsTo(Process::class, 'process_id'); }
Process模型
public function sector(): BelongsTo { return $this->belongsTo(Sector::class); }
日志输出
[2023-11-11 16:49:39] local.INFO: 5 [2023-11-11 16:49:39] local.INFO: 2 [2023-11-11 16:49:39] local.INFO: 1 [2023-11-11 16:49:39] local.INFO: 1 [2023-11-11 16:49:39] local.INFO: 2 [2023-11-11 16:49:39] local.INFO: 5 [2023-11-11 16:49:39] local.INFO: 5 [2023-11-11 16:49:39] local.INFO: 2 [2023-11-11 16:49:39] local.INFO: 1
问题分析
日志能输出部分sectorId,说明大部分数据的关联是正常的,但页面报错的核心原因是存在某条ProcessedMaterialOrder数据的关联链断裂:
- 可能某条
ProcessedMaterialOrder的process_id无效,导致$processedMaterialOrder->process为null; - 或者某条
Process数据没有关联的sector,导致$process->sector为null。
循环执行到这条异常数据时,尝试访问null的属性就会抛出错误,而日志只输出了报错前的有效数据。
解决方法
1. 提前过滤无效数据
查询时直接排除关联不完整的记录,从根源避免后续循环出错:
$processedMaterialOrders = ProcessedMaterialOrder::with('process.sector') ->has('process') ->has('process.sector') ->get();
2. 用可选调用规避空指针
在访问关联属性时使用?->(Laravel 8+支持),即使关联为空也不会触发报错:
$sectorId = $processedMaterialOrder->process?->sector?->id; if ($sectorId) { Log::channel('ecom')->info($sectorId); // 后续业务逻辑 }
3. 检查数据完整性
排查数据库中关联字段的有效性:
- 检查
processed_material_orders表中是否有process_id不存在于processes表的记录; - 检查
processes表中是否有sector_id不存在于sectors表的记录。
内容的提问来源于stack exchange,提问作者Igor do pálido ponto azul.
相关产品推荐
相关产品推荐

