Модель Laravel относится к проблеме загрузки отношений - PullRequest
0 голосов
/ 13 марта 2019

У меня есть две модели, Box и BoxLocations.Box имеет отношение hasMany к BoxLocations, а BoxLocations имеет отношение belongsTo к Box.

BoxLocations также имеет атрибут, который добавляется к модели, для которой требуется один фрагмент информации из отношения Box.

Я заметил, что при вызове Box::with(['BoxLocations']->)all(); я вижу, чтоBoxLocations модель перезагружает отношения Box.Это происходит для каждого BoxLocation (50 нечетных раз)

Не отслеживает ли laravel, что Box уже был загружен из исходного запроса Box::with(['BoxLocations']->)all();, а затем передает это в отношение BelongsTo?

Я пытаюсь оптимизировать веб-систему, и когда загруженный атрибут загружается (досадно, он требуется каждый раз, когда загружается также), он вызывает 50 нечетных попаданий в базу данных для той же модели Box, которую он уже загрузил.

Если Laravel не делает этого - есть ли лучший способ достичь вышеуказанного?

1 Ответ

0 голосов
/ 13 марта 2019

Laravel использует нетерпеливую загрузку , когда вы используете метод with().

При доступе к отношениям Eloquent в качестве свойств, данные отношений «загружаются лениво».Это означает, что данные отношения фактически не загружаются, пока вы не получите первый доступ к свойству.Однако Eloquent может «загружать» отношения во время запроса родительской модели.Стремительная загрузка облегчает проблему запроса N + 1.

Итак, если вы сделаете это:

$boxes = Box::with('BoxLocations')->get();

Это загрузит отношения уже, но позвольте вам сказать, что вы делаете это:

$boxes = Box::all();

foreach($boxes as $box)
{
  echo box->boxlocation->name;
}

Если выИмея 50 блоков, этот цикл будет выполнять 51 запрос.

Но если вы используете метод with и хотите загрузить отношение, этот цикл будет выполнять только 2 запроса.

Вы также можете использовать Lazy Eager Loading и решите, когда вы хотите загрузить отношения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...