Laravel нетерпеливая загрузка, кажется, не работает - PullRequest
0 голосов
/ 09 июня 2019

См. Отношения базы данных на изображении ниже.enter image description here

Я хочу показать все доступные часы (9 часов в день) в классе, включая вместимость этого часа и отделы, разрешенные для этого часа, включая предметы, которыеисключены из класса или предметов, для которых класс является исключительным.В моем show.blade.php я создаю таблицу, и каждая ячейка таблицы показывает один доступный час.Поскольку для этого нужны две петли, одна для дней и одна для часа дня, я хочу загрузить классную комнату отношениями.Но, судя по времени, которое требуется для выполнения запроса (почти 2 секунды), и количеству запросов, о которых сообщает телескоп, база данных подвергается сомнению с активной загрузкой или без нее.

В моем контроллере я загружаю отношения следующим образом:

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

Если я выбрасываю классную комнату, отношения загружаются.В моем show.blade.php я перебираю доступные часы следующим образом:

<!-- 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 Ответ

1 голос
/ 09 июня 2019

Когда вы вызываете $classroom->availableHours(), вы фактически снова запрашиваете функцию отношения и возвращаете ее, вместо того, чтобы получить доступ к уже существующей.

После загрузки отношений в контроллере объект заполняется атрибутами, содержащими нужные значения. Поэтому после загрузки используйте $classroom->availableHours. (как вы сделали с $allowedDepartment->exclusiveSubjects)

...