Laravel 5.6三级关联查询:如何获取Upload关联的Grade名称?
解决方法:获取Upload对应的Grade名称
首先得先确认你的模型关联和数据表结构是否匹配——从你给出的uploads表包含grade_id字段来看,这其实对应**Upload belongsTo Grade**(而不是你描述的Upload hasOne Grade),因为外键在uploads表,说明一个Upload属于一个Grade,而一个Grade可以对应多个Upload(如果是hasOne的关系,外键应该在grade表,命名为upload_id)。先把关联修正正确,后续操作才能正常运行。
步骤1:修正/确认模型关联方法
在Upload模型中,添加或修正关联方法:
// app/Models/Upload.php public function grade() { // 因为uploads表有grade_id,所以用belongsTo关联Grade模型 return $this->belongsTo(Grade::class); }
如果你确实需要Upload hasOne Grade的关系,那需要调整数据表结构,给grade表添加upload_id字段,然后关联方法改为:
public function grade() { return $this->hasOne(Grade::class); }
但根据你当前的表结构,第一种belongsTo是正确的选择。
步骤2:预加载关联,避免N+1查询问题
在控制器获取Assessment数据时,要预加载uploads以及对应的grade关联,这样循环时不会每次都发起新的数据库查询,提升性能:
// 比如在某个控制器方法中 $assessment = Assessment::with('uploads.grade')->find($your_assessment_id); // 如果是获取多个Assessment,就用get() // $assessments = Assessment::with('uploads.grade')->get();
步骤3:在Blade模板中显示Grade名称
现在你可以在循环中直接访问$upload->grade->name了,为了避免某个Upload没有关联Grade时出现报错,建议用??运算符处理空值情况:
@foreach ($assessment->uploads as $upload) <p>文件:{{ $upload->filename }} | 评分等级:{{ $upload->grade->name ?? '未设置等级' }}</p> @endforeach
这样就能顺利显示每个Upload对应的Grade名称啦!
内容的提问来源于stack exchange,提问作者Chev
相关产品推荐
相关产品推荐

