所以我有以下分类法:
>学校
>部门
>班级
一所学校有很多部门.一个部门有很多班.
部门属于学校.班级属于部门和学校.
学校,部门或班级可以分配测试.这是通过数据透视表确定的,如下所示:
>学校测试
>部门测试
> class_test
所有这些都绝对完美,但是在测试页上,我希望能够显示以下信息:
学校名称|部门名称|班级名称
如果是在学校范围内,则应仅显示学校名称.
如果是全系,则应显示:学校名称|部门名称.
如果是上课,则应显示:学校名称|部门名称|班级名称.
我的刀片服务器代码如下所示:
{{$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}}
这遍历了各种关系,但是我如何将其巧妙地纳入考虑范围以解决不同的情况?
欢迎所有帮助!
解决方法:
获取所有测试$tests = Test :: all()(或根据需要添加查询范围)
使用@foreach($tests作为$test)遍历每个测试
将关系添加到学校,部门,班级的测试模型班级
function school() {
$this->belongsTo(School::class);
}
创建一个辅助函数来确定测试直接属于什么
function isFor($parent) {
switch($parent) {
case 'school':
return $this->school;
case 'department':
return $this->department;
case 'class':
return $this->class;
}
}
然后您可以在视图中使用它来检查测试直接属于什么
@if($test->isFor('school'))
如果您不想切换/区分大小写,请使用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
并准确地将该视图包含在该部分视图中
标签:relationship,laravel,blade,php
来源: https://codeday.me/bug/20191110/2013431.html