Laravel渴望加载似乎不起作用

时间:2019-06-09 12:17:19

标签: laravel eager-loading

请参见下图中的数据库关系。 enter image description here

我想显示一个教室的所有可用小时(每天9个小时),包括该小时的容量和该小时所允许的部门,包括排除在教室之外的主题或该教室所属的主题独家。 在我的show.blade.php文件中,我建立了一个表,每个表单元格都显示一个availableHour。由于这需要两个循环,一个循环用于一天,一个循环用于一天中的一个小时,因此我想向教室加载这种关系。但是,从请求完成的时间(将近2秒)和望远镜报告的数据库数量(无论是否加载)开始质疑。

在我的控制器中,我这样加载关系:

$classroom->load('availableHours.allowedDepartments.exclusiveSubjects.subject',
'availableHours.allowedDepartments.excludedSubjects.subject',
'availableHours.allowedDepartments.department');

如果我丢掉教室,关系就会加载。在我的show.blade.php中,我循环遍历了如下的availableHours:

<!-- loop through all the hours of the day  -->
    @for($i=1;$i<=$maxHour;$i++)
        <tr>
        <td>
        <a href="/classrooms/{{$classroom->number}}/0/{{$i}}/edit">
            {{$i}}
        </a></td>
        <!-- loop through all the days -->
        @foreach($days as $day)
            <!-- show the available hour either in green (available) or red (unavailable)-->
            <td>
            <a href="/classrooms/{{$classroom->number}}/{{$day->id}}/{{$i}}/edit">
                <!-- show the capacity of the hour of the day-->
                {{ $classroom->availableHours()->where([['day_id','=',$day->id],['hour_of_day',$i]] )->first()->capacity }} <br/>

                @foreach($classroom->availableHours()->where([['day_id','=',$day->id],['hour_of_day',$i]] )->first()->allowedDepartments as $allowedDepartment)
                <!-- show the permitted departments along with any exclusive or excluded subjects-->
                {{$allowedDepartment->department->name}}
                @foreach ($allowedDepartment->exclusiveSubjects as $subjectDepartment)
                    {{$subjectDepartment->subject->code}}
                @endforeach
                 <br/>
                @endforeach
            </a></td>
        @endforeach
        </tr>
    @endfor

正如我所说,这导致再次查询数据库,而不是使用预加载的关系。我在做什么错了?

1 个答案:

答案 0 :(得分:1)

调用$classroom->availableHours()时,实际上是在再次查询关系函数并返回它,而不是访问已经存在的那个。

在控制器中加载关系后,该对象将填充包含所需值的属性。因此,加载后,请改用$classroom->availableHours。 (就像您对$allowedDepartment->exclusiveSubjects所做的一样)