Это классическая проблема N+1 запроса: при обращении к БД делаем лишних N запросов, хотя можно обойтись одним сразу.
В Laravel она возникает из-за ленивой загрузки отношений по умолчанию, те при выборке данных модели из БД, отношения не выбираются. Чтобы этого избежать используется with (и его "друзья").
//Выбрали все посты, данные только по ним
$posts = Post::orderBy('created_at', 'desc')->limit(20)->get();
foreach( $posts as $post )
{
//обращение к БД за данными по отношению user
print_r($post->user);
}
//Два запроса
// 1.Выбрали все посты, данные только по ним
// 2. ПО айдишкам из данных таблицы постов, выбрали сразу все нужные из user
$posts = Post::orderBy('created_at', 'desc')->with('user')->limit(20)->get();
foreach( $posts as $post )
{
//обращение к БД за данными по отношению user НЕ происходит, данные уже есть и скомпонованы
print_r($post->user);
}
Советую
читать документацию,
так же самые распространенные подводные камни с N+1
https://laravel-news.com/laravel-n1-query-problems