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