Laravel жаждет проблемы загрузки. Как исправить предупреждение N+1, которое я получаю?
У меня есть функция, которую я использую в представлении, где она используется в цикле. Таким образом, он используется несколько раз. Я думаю, что из-за этого у меня есть проблема 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. Я не уверен, как исправить мою функцию, чтобы удовлетворить это.


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

16.11.2019 03:43:52
Ваше представление изначально получает $newUserAccount
с нетерпеливыми загруженными applications
. Таким $newUserAccount
загруженные приложения.
Однако во время цикла на этой странице Блейда вы передаете applications
id
обратно в контроллер, где вы загружаете совершенно новую newUserAccount
отчасти это то, откуда исходит ваша newUserAccount
. Ваш $newUser = $newUserAccount->with('applications')->where('id', $newUserId)->first();
на новый экземпляр в каждом цикле из blade.
Таким образом , он отправляет n+1
, создавая $newUserAccount
-это уже один объект, который пришел из параметров метода - это уже первый объект, основанный на applications
, но вы запускаете вышеуказанную строку, как если бы это была коллекция. Я думаю, что это, вероятно, постороннее, но я не уверен, поскольку я действительно не знаю, откуда берется этот объект в парах.
Чтобы исправить повторные вызовы базы данных, выполните всю логику подготовки в этом id
перед отправкой в файл Блейда, вместо того, чтобы файл Блейда продолжал вызывать контроллер в каждом цикле newUserAccount
. Другими словами, прежде чем перейти к Блейду в первый раз, у $newUserAccount
есть newUserAccounts и получите список id
ahead time , который вы можете выбрать из логики блейд-цикла.