Ленивая и жадная загрузка в Laravel
Связанные модели в Laravel по умолчанию загружаются лениво. Это значит, что SQL-запрос к связанной таблице выполняется в момент обращения к отношению.
Пусть у нас категории связаны с постами
через hasMany. Если взять все категории
и в цикле обратиться к постам каждой,
получится проблема N+1: один запрос
на категории и ещё по одному на каждую
категорию:
<?php
$categories = Category::all();
foreach ($categories as $category) {
foreach ($category->posts as $post) {
dump($post->title);
}
}
?>
Для решения проблемы используют
жадную (нетерпеливую) загрузку.
Метод with заранее подгружает
связанные данные. Имя в массиве должно
совпадать с именем метода отношения:
<?php
$categories = Category::with(['posts'])->get();
foreach ($categories as $category) {
foreach ($category->posts as $post) {
dump($post->title);
}
}
?>
Теперь будет два запроса: один за категориями и один за всеми нужными постами. Лишних запросов в цикле не будет.
Выберите несколько задач из предыдущих уроков и переделайте их код на жадную загрузку.