В Laravel Eloquent ORM предоставя два метода за зареждане на релации между модели — Eager loading и Lazy loading.

Мързеливо зареждане.

Данните за връзката са „заредени отложено“ при достъп до връзките на Eloquent като свойства. Това означава, че данните за връзката всъщност не се зареждат, докато за първи път не получите достъп до свойството.

Но този подход въвежда проблема N+1, който мнозина познават в Laravel, например от документацията на laravel:

use App\Models\Book;
 
$books = Book::all();
 
foreach ($books as $book) {
    echo $book->author->name;
}

Този цикъл ще изпълниедна заявка за извличане на всички книги, след това друга заявка за всяка книга за извличане на автора на книгата.

И така, имаме 1 заявка за списъка с книги + N заявки за данни за автора за всяка книга, следователно N+1.

Но Laravel е достатъчно милостив да ни даде някои помощници, за да избегнем подобни капани в производителността.

Нетърпеливо зареждане.

Това може да се случи преди използването на свойствата на релацията.
Можем да използваме нетърпеливо зареждане, за да заредим данни за връзката, преди да имаме достъп до тях, като по този начин намалим броя на заявките от N+1 до само 2.

Чрез използването на with() можете да „нетърпеливо зареждате“ връзки по време на запитване към родителския модел:

$books = Book::with('author')->get();

1 за извличане на списъка с книги и 1 за извличане на всички автори за всички книги и можем да направим това чрез:

$books = Book::with('author')->get();
 
foreach ($books as $book) {
    echo $book->author->name;
}

Мързеливо нетърпеливо зареждане

Понякога искате да заредите нетърпеливи отношения, след като родителският модел вече е бил извлечен или само ако е изпълнено условие.

В Laravel load() и loadMissing() са два метода, налични в Eloquent ORM, които се използват за нетърпеливо зареждане на връзки.

$book->load('author');

Което също може да се използва само за нетърпеливо зареждане на липсващи:

$book->loadMissing('author');

Противно на метода load(), методът loadMissing() филтрира през дадените отношения и лениво ги зарежда само ако вече не са заредени.

Този метод може да бъде полезен, когато искате да заредите само релациите, които все още не са заредени, за да избегнете ненужни заявки към базата данни. Например, за да заредите всички липсващи коментари за една и съща публикация, можете да използвате метода loadMissing() по следния начин:

$post = Post::find(1);
$post->loadMissing('comments');

Това ще зареди само коментарите, които все още не са заредени, без да правите допълнителни заявки за коментарите, които вече са заредени.

Чрез приемане на затваряния и двата метода поддържат персонализирана логика за зареждане на релации.

По отношение на производителността методът loadMissing() обикновено е по-бърз от метода load(), тъй като зарежда само липсващите релации, без да прави допълнителни заявки за релациите, които вече са заредени. Това може значително да намали броя на заявките към базата данни и да подобри цялостната производителност на вашето приложение.

В обобщение, load() зарежда всички посочени релации, дори ако те вече са заредени, докато loadMissing() зарежда само релациите, които все още не са заредени.

Чувствайте се свободни да се Абонирате за повече съдържание като това 🔔, ръкопляскайте 👏🏻 , коментирайте💬 и споделете статията с когото пожелаеш

И както винаги е било, оценявам вашата подкрепа и благодаря за четенето.