Связанные модели в Laravel загружаются отложено. Это значит, что SQL запрос выполняется в момент обращения к объекту модели. Это на самом деле плохо, так как выполняется большое количество запросов к базе. Давайте посмотрим на примере.
Пусть у нас таблица с категориями связана
с таблицей с постами отношением hasMany
.
Давайте для нашей категории переберем циклом
коллекцию ее постов. В результате SQL запрос
будет отправляться каждую итерацию
цикла:
<?php
class CategoryController extends Controller
{
public function show()
{
$category = Category::find(1);
foreach ($category->posts as $post) {
dump($post); // тут каждый раз шлется запрос
}
}
}
?>
Для решения проблемы мы можем использовать
жадную (нетерпеливую) загрузку. С помощью
метода with
мы можем заранее подгрузить
данные связанной модели. Давайте
сделаем это:
<?php
class CategoryController extends Controller
{
public function show()
{
$category = Category::with(['post'])->first();
}
}
?>
Теперь при переборе циклом лишних запросов не будет:
<?php
class CategoryController extends Controller
{
public function show()
{
$category = Category::with(['post'])->first();
foreach ($category->posts as $post) {
dump($post);
}
}
}
?>
Выберите несколько задач из предыдущих уроков и переделайте их код на жадную загрузку.