Laravel жаждет проблемы загрузки. Как исправить предупреждение N+1, которое я получаю?

Laravel жаждет проблемы загрузки. Как исправить предупреждение N+1, которое я получаю?

16.11.2019 02:49:39 Просмотров 51 Источник

У меня есть функция, которую я использую в представлении, где она используется в цикле. Таким образом, он используется несколько раз. Я думаю, что из-за этого у меня есть проблема N+1. В моих функциях я стремлюсь загружать модели, но я все еще получаю предупреждение N+1.

Моя функция на TaskController

    public function appDefaultPassword($newUserAccount, $newUserId)
    {   

        // Check if application default_password is set
        if($this->application->default_password) {
            return $this->application->decryptDefaultPass();
        // Check if application use_network_password is true
        }elseif($this->application->use_network_password) {
            // Get newUserAccount

            $newUser = $newUserAccount->with('applications')->where('id', $newUserId)->first();
            $netapp = $newUser->applications->where('app_type', 'LDAP')->first();
            $tasks = $this->with('actions')->where('model_id', $newUserAccount->id)->where('application_id', $netapp->id)->first();
            $taskAction = $tasks->actions->where('password', !NULL)->last();


            return decrypt($taskAction->password);

        }

    }

В моем NewUserAccountController я также стремлюсь загружать приложения и задачи.действия

public function show($newUserAccount)
    {
$newUserAccount = NewUserAccount::with('applications', 'task.application.admins', 'task.actions', 'approvalActions')->find($newUserAccount);
}

По-моему:

@foreach($newUserAccount->task as $task)
...

    {{ $task->appDefaultPassword($newUserAccount->id) }}

...
@endforeach

Я использую детектор запросов Laravel N+1, который обнаруживает эту проблему N+1. Я не уверен, как исправить мою функцию, чтобы удовлетворить это.

enter image description here

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/58886141/laravel-eager-loading-problem-how-do-i-fix-the-n1-warning-that-im-getting#comment104039554_58886141
appDefaultPassword должен получить в качестве первого параметра элемент UserAccount, но вы передаете только идентификатор этого UserAccount
https://stackoverflow.com/questions/58886141/laravel-eager-loading-problem-how-do-i-fix-the-n1-warning-that-im-getting#comment104039571_58886141
пожалуйста, также опубликуйте структуру базы данных

Ответы - Laravel жаждет проблемы загрузки. Как исправить предупреждение N+1, которое я получаю? / Laravel eager loading problem. How do I fix the N+1 warning that I'm getting?

Watercayman

16.11.2019 03:43:52

Ваше представление изначально получает $newUserAccountс нетерпеливыми загруженными applications. Таким $newUserAccountзагруженные приложения.

Однако во время цикла на этой странице Блейда вы передаете applicationsidобратно в контроллер, где вы загружаете совершенно новую newUserAccount

отчасти это то, откуда исходит ваша newUserAccount. Ваш $newUser = $newUserAccount->with('applications')->where('id', $newUserId)->first(); на новый экземпляр в каждом цикле из blade.

Таким образом , он отправляет n+1, создавая $newUserAccount-это уже один объект, который пришел из параметров метода - это уже первый объект, основанный на applications, но вы запускаете вышеуказанную строку, как если бы это была коллекция. Я думаю, что это, вероятно, постороннее, но я не уверен, поскольку я действительно не знаю, откуда берется этот объект в парах.

Чтобы исправить повторные вызовы базы данных, выполните всю логику подготовки в этом idперед отправкой в файл Блейда, вместо того, чтобы файл Блейда продолжал вызывать контроллер в каждом цикле newUserAccount. Другими словами, прежде чем перейти к Блейду в первый раз, у $newUserAccountесть newUserAccounts и получите список idahead time , который вы можете выбрать из логики блейд-цикла.

Закрыть X