Eager loading ve lazy loading, veritabanından ilişkili verileri almak için kullanılan iki farklı yaklaşımı ifade eder. İşte bu iki yaklaşımın farklarına ve basit bir örneğe sahip bir açıklama:
1) Eager Loading (İstekli Yükleme):
Tanım: Eager loading, ilişkili verileri başlangıçta ana sorgu ile birlikte çeker. İlişkili verilere ihtiyaç duyulup duyulmadığına bakılmaksızın tüm verileri bir arada getirir.
Örnek: Bir blog uygulamasında, kullanıcıları ve bu kullanıcılara ait tüm yazıları çekmek istiyorsunuz. Eager loading kullanarak tüm kullanıcıları çekerken aynı anda her kullanıcının tüm yazılarını da çekebilirsiniz. Bu, veritabanı sorgusu sayısını azaltır ve sorgu performansını artırır.
$users = User::with('posts')->get();
2) Lazy Loading (Tembel Yükleme):
Tanım: Lazy loading, ilişkili verilere erişim sağlandığında o verileri sorgular. Yani, ilişkili verileri çekmez, ancak verilere erişim talep edildiğinde çeker.
Örnek: Yine aynı blog uygulamasında, kullanıcıları çekerken ilişkili yazıları çekmek istemiyorsunuz ve bu yazılara ihtiyaç duyduğunuzda çekmek istiyorsunuz. Lazy loading kullanarak, kullanıcıları çekerken ilişkili yazıları çekmezsiniz. İhtiyaç duyduğunuzda, bir kullanıcının yazılarına eriştiğinizde bu yazıları çeker.
// Kullanıcıları çekin $users = User::all(); // Kullanıcının yazılarına erişildiğinde (lazy loading kullanarak), yazıları çekilir. $user->posts;
Farklar:
Eager loading, ilişkili verileri başlangıçta çeker ve veritabanı sorgu sayısını azaltırken, lazy loading ilişkili verilere erişim talep edildiğinde çeker ve sorgu sayısını artırabilir.
Eager loading, performans açısından daha etkilidir, çünkü tek bir sorgu ile verileri alır ve N+1 sorgu sorununu önler. Lazy loading ise daha fazla sorgu yapılmasına neden olabilir.
Eager loading, verilerin ön yüklenmesini sağlar ve belirli bir işlevselliği uygulamak için verilere erişim gereksinimlerini düşünmeden kullanabilirsiniz. Lazy loading ise sadece ihtiyaç duyulduğunda verileri çeker, bu nedenle performansı daha fazla düşünmeniz gerekebilir.
Hangi yaklaşımın kullanılacağı, uygulamanızın ihtiyaçlarına ve performans gereksinimlerine bağlıdır. Eğer ilişkili verilere her zaman ihtiyaç duyacaksanız, eager loading tercih edilir. Ancak verilere nadiren veya belirli koşullara bağlı olarak erişiyorsanız, lazy loading kullanılabilir.