Laravel访问puroks属性报Attempt to read property错误求助
问题:Laravel Eloquent关联报错Attempt to read property "puroks" on null
我用Laravel开发功能,需要展示下拉框选中日期范围内感染指定疾病的受访者,同时显示受访者所属住户及对应的purok,但访问purok时触发错误:Attempt to read property "puroks" on null。
视图代码
@foreach($infectedRespondents as $household) <tr> <td>{{ $household->id }}</td> <td>{{ $household->household->puroks->purok_num }}</td> <td>{{ $household->name }}</td> </tr> @endforeach
控制器代码
public function getInfected(Request $request) { $SDOHs = SDOH::all(); $categories = SDOHCategory::all(); $HDs = HD::all(); $diseases = Disease::all(); $vaccines = Vaccine::all(); $envHazards = EnvHazard::all(); $puroks = Purok::all(); $households = HouseholdHead::with('categoryHouseholds.sdoh_category')->get(); $respondents = Respondent::with('household_heads')->get(); $selectedDiseaseId = $request->input('disease'); $startDate = $request->input('start'); $endDate = $request->input('end'); $infectedRespondents = Respondent::whereHas('diseases', function ($query) use ($selectedDiseaseId, $startDate, $endDate) { $query->where('disease_id', $selectedDiseaseId) ->whereBetween('date', [$startDate, $endDate]); }) ->with(['household_heads.puroks']) ->get(); return view('filtered_map', compact('households', 'SDOHs', 'categories', 'diseases', 'vaccines', 'envHazards', 'respondents', 'puroks', 'HDs', 'infectedRespondents')); }
表结构说明
- household_heads表:包含purok_id字段,关联puroks表
- respondents表与household_heads表通过respondent_households中间表关联,中间表包含respondent_id和household_head_id外键
解决方案
1. 修正视图中的关联名称与空值处理
视图里存在两个核心问题:
- 控制器预加载的关联是
household_heads,但视图中写成了household,名称不匹配 - 未处理关联为空的情况,导致访问null的属性报错
如果受访者与住户是多对多关联(对应中间表),视图代码修正如下:
@foreach($infectedRespondents as $respondent) <tr> <td>{{ $respondent->id }}</td> <td> @foreach($respondent->household_heads as $householdHead) {{ $householdHead->puroks?->purok_num }}@if(!$loop->last), @endif @endforeach </td> <td>{{ $respondent->name }}</td> </tr> @endforeach
使用?->可选链操作符避免null报错,同时遍历所有关联的住户。
如果受访者与住户是一对一关联,需先调整模型关联,再修改视图:
@foreach($infectedRespondents as $respondent) <tr> <td>{{ $respondent->id }}</td> <td>{{ $respondent->household_head?->puroks?->purok_num }}</td> <td>{{ $respondent->name }}</td> </tr> @endforeach
2. 确认Eloquent关联定义正确性
确保模型中的关联定义与表结构匹配:
- Respondent模型(多对多关联住户):
public function household_heads() { return $this->belongsToMany(HouseholdHead::class, 'respondent_households', 'respondent_id', 'household_head_id'); }
- HouseholdHead模型(关联purok):
public function puroks() { return $this->belongsTo(Purok::class, 'purok_id'); }
3. 控制器过滤无住户的受访者
可以在查询时直接排除没有关联住户的受访者,减少视图中的空值处理:
$infectedRespondents = Respondent::whereHas('diseases', function ($query) use ($selectedDiseaseId, $startDate, $endDate) { $query->where('disease_id', $selectedDiseaseId) ->whereBetween('date', [$startDate, $endDate]); }) ->whereHas('household_heads') // 仅保留有住户关联的受访者 ->with(['household_heads.puroks']) ->get();
内容的提问来源于stack exchange,提问作者Big Brother
相关产品推荐
相关产品推荐

