Я изучаю 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
уже было извлечено, но вы все равно хотите получить ее отношения.
Надеюсь, эта помощь!