根据关系获得头衔(laravel)

时间:2018-01-24 11:46:47

标签: php laravel relationship blade

所以我有以下分类:

  • 学校

学校hasMany部门。部门hasMany课程。

一个部门belongsTo一所学校。班级belongsTo一个部门和一所学校。

学校,部门或班级可以分配测试。这是通过像这样的数据透视表确定的:

  • school_test
  • department_test
  • class_test

这一切都非常完美,但在测试页面上,我希望能够显示以下信息:

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}}

遍历这些关系,但是如何在我的视图中整齐地将这种关系纳入考虑不同的场景?

欢迎所有帮助!

2 个答案:

答案 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这里是多对多的关系。

与获得部门和班级的方式相同。