Отношения один ко многим в Ларавел (Laravel) объяснение и нетерпеливая загрузка (eager loading), как использовать?
 
        Связь один ко многим и многие к одному наиболее часто используемая в веб программировании.
Начнем с простого примера этой связи. Например у одного человека есть множество банковских карт и каждая из этих карт принадлежит только этому человеку или у пользователя есть множество комментариев и каждый этот комментарий принадлежит именно этому пользователю.
 
        Связь один ко многим и многие к одному в Ларавел (Laravel) реализуется следующим способом.
Изначально следует определится будете ли вы придерживается правил именований таблиц и ключей Ларавел (Laravel).
Это руководство соответствует всем правилам именований для упрощения понимания примеров и описывает преимущества нетерпеливой загрузки (eager loading). Ознакомится с требованиями к таблицам баз данных можно в документации данного фреймворка.
Используем простой пример пользователей и их постов.
Создадим две таблицы: Users, Posts.
 
        Далее определим две модели: User и Post - (имена в единственном числе).
В модели User:
        
public function posts() {
                //--- Имя функции во мнж. числе
                //--- Ссылаемся на мнж. Связь.
// Ссылаемся из родительской на дочернюю
return $this->hasMany(Post::class);
}
        
        В модели Post:
        
public function user() {    
                // ---   в единственном числе 
                // ---   Ссылаемся на одн. Связь.
 // Ссылаемся из дочерней на родительскую
 return $this->belongsTo(User::class);  
}
        Нетерпеливая загрузка (Eager Loading) предпочтительна
Запрос к базе данных происходит только один раз, загружая данные и их связи. И при последующем обращении к свойствам и их отношениям внутри приложения, база данных больше не затрагивается. Таким образом экономя огромный ресурс, это особенно заметно на больших проектах.
Определение нетерпеливой загрузки (Eager Loading) выполняется с помощью вызова функции with() в которую передаются имена функций указанных в моделях, строкой.
Выборка данных с помощью нетерпеливой загрузки (Eager Loading).
Пример выборки пользователя с (id 1) и всех его постов:
        
User::with('posts')->where('id', 1)->get();
        
        Рассмотрим другой пример и представим, что у постов пользователя есть комментарии. Сделаем теперь выборку всех постов и комментариев для того же пользователя.
        
User::with('posts.comments')->where('id', 1)->get(); 
        
        Как узнать кто автор поста с (id 1)? Для этого воспользуемся отношением (многие-к-одному).
        
Post::with('user')->where('id', 1)->get();
        
        Пойдем дальше и определим комментарий с (id 1) к каким постам принадлежит и кто авторы этих постов (если таковые есть):
        
Comment::with('post.user')->where('id', 1)->get();
        
        Как получить результат всех отношений разных направлений как для одного так и для всех пользователей?
 
        Изменим предыдущий пример и выберем теперь пользователя с (id 1) и все его посты, а так же комментарии к ним это связи (one to many), но мы хотим так же получить все заголовки этих постов это связь (one to one), как это сделать? Просто перечислите отношения, разделив их запятой в функции with().
        
$users =
User::with(['posts.comments', 'posts.description'])->where('id', 1)
->get();
        
        Можно делать огромные цепи связей и легко получать доступ к любой таблице понятным и простым способом используя преимущества нетерпеливой загрузки (Eager Loading) при этом получая оптимизированные запросы к базе данных. Соответственно предварительно добавив в модель функции: hasMany, hasOne и belongsTo столько сколько необходимо. Главное правильно указывать последовательность функций.
Ленивая загрузка (Lazy Load) не рекомендуеться
Используется по умолчанию при обращении к свойствам и их отношениям внутри приложения каждый раз будет запрашивать базу данных. К примеру есть 50 комментариев и на каждой итерации цикла произойдет обращение к базе данных всего 51.
        
@foreach ($users as $user)
   $user->comments
   
@endforeach
        
        Если у вас возникли сложности с пониманием или реализацией мы всегда готовы помочь вам для этого свяжитесь с нами удобным для вас способом.