【问题标题】:Get title based on relationship (laravel)根据关系获取标题(laravel)
【发布时间】:2018-07-03 10:56:39
【问题描述】:

所以我有以下分类:

  • 学校
  • 部门

一所学校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}}

这会遍历关系,但我如何将其巧妙地整合到我的视图中以解释不同的场景?

欢迎大家帮忙!

【问题讨论】:

  • 为什么在你的视图中查询??每一行都在做一个不好的新查询,对吧??
  • 嘿@Sohel0415 - 公平点。这主要是为了让我快速测试。我会在某个时候将它重构为模型方法。
  • 使用控制器代码、模型中的关系函数更新您的问题

标签: php laravel relationship blade


【解决方案1】:

获取所有测试$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

并将该视图应包含的内容准确放入该部分中

【讨论】:

    【解决方案2】:

    通过考试 ID 上学:

    School::whereHas('tests', function($q) use($testId) {
        $q->where('id', $testId);
    })->first();
    

    tests 这里是多对多关系。

    获取部门和班级的方法相同。

    【讨论】:

    • 谢谢,这很有帮助,但它会抓取属于某个部门的所有课程。例如,我希望能够获得分配给测试的特定类。
    • @roo 很抱歉,但我不明白这个问题。如果您只想获得一些类,请使用约束。如果您只想上一门课,请描述具体的标准。
    • 澄清:我想加载一个特定的测试,看看哪个学校 |部门 |它被分配到的类。
    • 谢谢,这非常有用!我最终选择了另一个答案,但这也是有效的:)
    猜你喜欢
    • 2016-10-11
    • 2021-12-08
    • 2021-09-09
    • 2014-01-20
    • 1970-01-01
    • 2021-05-06
    • 2018-12-13
    • 2020-06-24
    • 2020-07-01
    相关资源
    最近更新 更多