🔹 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! 🚀