Laravel’de with() Fonksiyonu Nedir ve Ne İşe Yarar?

"Laravel’de with() Fonksiyonu Nedir ve Ne İşe Yarar?"

🔹 with() fonksiyonu, Eager Loading (ön yükleme) yaparak ilişkili verileri daha verimli bir şekilde çekmeyi sağlar.
🔹 N+1 sorgu problemini önlemek için kullanılır.
🔹 Performansı artırır çünkü ilişkili verileri tek bir sorguda çeker.


🎯 Örnek 1: with() Olmadan Kullanım (N+1 Problemi)

$products = Product::all();

foreach ($products as $product) {
    echo $product->images; // Her ürün için ayrı bir SQL sorgusu çalışır
}

📌 Problemler:
Her ürün için ayrı sorgu atılır. (Örneğin, 100 ürün varsa 100 ek sorgu!)
Veritabanı yükü artar.
Performans düşer.

📌 Çalışan SQL sorguları:

SELECT * FROM products;  -- Ana ürünleri çeker
SELECT * FROM product_images WHERE product_id = 1;
SELECT * FROM product_images WHERE product_id = 2;
SELECT * FROM product_images WHERE product_id = 3;
...

🎯 Örnek 2: with() Kullanarak (Daha Hızlı ve Optimize)

$products = Product::with('images')->get();

foreach ($products as $product) {
    echo $product->images; // Tek sorguyla tüm ilişkili veriler çekildi
}

📌 Avantajlar:
Tek bir SQL sorgusu çalışır.
N+1 problemini çözer.
Performans çok daha iyi olur.

📌 Çalışan SQL sorgusu:

SELECT * FROM products;
SELECT * FROM product_images WHERE product_id IN (1, 2, 3, 4, ...);

Böylece 100 sorgu yerine sadece 2 sorgu çalışır! 🚀


🛠 with() ile İleri Seviye Kullanım

1️⃣ Belirli Sütunları Seçme (Gereksiz Verileri Çekmemek İçin)

$products = Product::with(['images' => function ($query) {
    $query->select('product_id', 'image_url'); // Gereksiz sütunları almaz
}])->select('id', 'name')->get();

📌 Avantaj: Daha az veri çekildiği için sorgu daha hızlı çalışır.


2️⃣ Çoklu İlişkili Modelleri Yükleme

Bir ürünün resimleri ve kategorisi olsun:

$products = Product::with(['images', 'category'])->get();

📌 Bu sorgu, 3 tabloyu tek seferde çeker.

SELECT * FROM products;
SELECT * FROM product_images WHERE product_id IN (...);
SELECT * FROM categories WHERE id IN (...);

3️⃣ withCount() ile İlişkili Verileri Sayma

Eğer her ürünün kaç resmi olduğunu öğrenmek istiyorsan:

$products = Product::withCount('images')->get();

foreach ($products as $product) {
    echo $product->images_count; // Resim sayısını gösterir
}

📌 Avantaj: Fazladan sorgu atmak yerine Laravel direkt COUNT() ile tek sorguda sayıyı döndürür.

SELECT *, (SELECT COUNT(*) FROM product_images WHERE product_id = products.id) AS images_count
FROM products;

📌 Özet

Yöntem Avantaj Performans
Normal (all()) Kullanım Kolay, ama N+1 problemi var Yavaş ❌
Eager Loading (with()) Tek sorgu ile tüm ilişkili verileri alır 🚀 Hızlı ✅
Belirli Sütunlarla (select()) Gereksiz veri çekmez 🏆 Daha hızlı ✅✅
withCount() COUNT() ile sayım yapar 📊 En verimli ✅✅✅

Laravel’de with() fonksiyonunu kullanarak ilişkili verileri daha hızlı ve verimli çekebilirsin.
Eğer büyük veri kümeleriyle çalışıyorsan, with() kullanman performans açısından kritik! 🚀

Aykhan Gasimzade Aykhan Gasimzade verified icon
Full Stack Developer

Merhaba! Ben Aykhan, 1999 doğumlu bir Azerbaycanlıyım ve 2017 yılından bu yana programlamayla ilgileniyorum. Teknolojinin büyülü dünyası beni her zaman etkilemiştir ve bu merakımı kendi blogumda paylaşarak daha geniş bir kitleyle buluşturmayı amaçlıyorum.