所以我有以下分类:
学校hasMany
部门。部门hasMany
课程。
一个部门belongsTo
一所学校。班级belongsTo
一个部门和一所学校。
学校,部门或班级可以分配测试。这是通过像这样的数据透视表确定的:
这一切都非常完美,但在测试页面上,我希望能够显示以下信息:
School Name | Department Name | Class Name
如果它在全校范围内,那么它应该只显示学校名称。
如果是部门范围,则应显示:School Name | Department Name
。
如果是某个课程,那么它应该显示:School Name | Department Name | Class Name
。
我的刀片代码如下:
{{$test->school->first()->name}}
@if($test->department->isNotEmpty())
|
{{$test->department->first()->name}}
@if($test->class->isNotEmpty())
|
{{$test->class->first()->name}}
@endif
@endif
这适用于在全校范围内进行的测试,但是当我尝试为课程加载测试时它会中断,因为它显然与某个部门没有关系通过数据透视表。相反,我需要做这样的事情:
{{$test->class->first()->department->school->name}}
遍历这些关系,但是如何在我的视图中整齐地将这种关系纳入考虑不同的场景?
欢迎所有帮助!
答案 0 :(得分:2)
获取所有测试$tests = Test::all()
(或根据需要添加查询范围)
使用@foreach($tests as $test)
为School,Department,Class
的Test
模型类添加关系
function school() {
$this->belongsTo(School::class);
}
创建辅助函数以确定Test直接属于
的内容function isFor($parent) {
switch($parent) {
case 'school':
return $this->school;
case 'department':
return $this->department;
case 'class':
return $this->class;
}
}
然后,您可以在视图中使用它来检查测试直接属于哪个
@if($test->isFor('school'))
如果您不想switch/case
,请使用if/elseif
执行类似
function isFor() {
if($this->school) {
return 'school';
}
elseif($this->department) {
return 'department';
}
elseif($this->class) {
return 'class';
}
}
然后在视图中:
@if($test->isFor() == 'school')
一旦确定直接父母的内容,您可以直接从父母那里继续访问姓名,而不必经历另一种关系:
@if($test->isFor('department'))
{{ $test->department->name }}
我还建议为每个不同的视图创建不同的部分/视图
@if($test->isFor('department'))
@include('partials.test-department')
@endif
并确切地说该视图应包含在该部分
中答案 1 :(得分:1)
通过其测试ID获得学校:
School::whereHas('tests', function($q) use($testId) {
$q->where('id', $testId);
})->first();
tests
这里是多对多的关系。
与获得部门和班级的方式相同。