Яркая загрузка, сдерживание жадных нагрузок, ленивая нетерпеливая загрузка

Я изучаю Laravel, и я использую Laravel 5.2. Я хочу знать, что такое Eager Loading, Constraining Eager Loads и Lazy Eager Loading. Каковы сходства и различия между этими тремя? Можете ли вы привести пример для каждого из них? Я прочитал документацию Laravel, но я до сих пор не понимаю. Надеюсь, вы сможете дать более четкое объяснение. Благодарю.

Ореховая скорлупа:

Eager Loading позволяет вам эффективно получать отношения для некоторых моделей.

Constraining Eager Loads снова делает его эффективным, но вы можете ограничить свои результаты, например, диапазон дат, конкретный идентификатор и т. Д.

Lazy Eager Loading – это когда вы уже загрузили родительские модели

Пример:

Хорошо, скажем, вы делаете блог, где у вас будут сообщения, и у этих сообщений могут быть комментарии и пожелания.

Сценарий 1:

Вы хотите получить все Posts с их Comments и их Comments . Будете ли вы загружать все Posst а затем проходить через них и получать comments и comments ? Ну, вы могли бы, но это могло бы стать очень дорогостоящим, так как это может привести к выполнению многих и многих запросов. Или вы можете загружать сообщения, а затем получать их id и загружать все комментарии, которые вам нужны для этих id и то же самое, что и нравится. Это, по сути, то, что делает Laravel с нетерпением.

Сценарий 2 (реальный пример сценария 1):

Вы создаете фид для сообщений. Итак, вы загрузили все свои сообщения, а затем хотите показать, сколько им нравится и комментирует, поэтому у вас будет что-то вроде (очень простое):

контроллер:

 $posts = App\Post::all(); return view('posts.index', compact('posts')); 

файл клинка:

 @foreach($posts as $post) <h2>{{ $post->title }}</h2> <p>{{ $post->description }}</p> <p> Likes: {{ $post->likes->count() }} <br> Comments: {{ $post->comments->count() }} </p> @endforeach 

Вышеизложенное будет работать, но для каждого цикла он будет фактически запрашивать базу данных. Изменение контроллера на:

 $posts = App\Post::with('likes', 'comments')->get(); return view('posts.index', compact('posts')); 

Затем вы получите comments и likes для всех должностей, предварительно сохранив базу данных и сделав ваше приложение более эффективным.

Сценарий 3

Я хочу показать Posts но хочу только показать последние 3 comments которые были сделаны.

 $posts = App\Post::with(['comments' => function ($query) { $query->limit(3); }]); 

Lazy Eager Loading – это когда вы уже загрузили свои Posts и после этого вам нужно получить все comments или likes после факта. Тот же принцип, но вы использовали бы load вместо with . Другая причина, по которой вы можете использовать нагрузку, – это использование Route model binding для ваших контроллеров, чтобы Post уже было извлечено, но вы все равно хотите получить ее отношения.

Надеюсь, эта помощь!