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

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

Feb 05, 2025
926 görüntülenme
0 yorum

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

Yorumlar

Bu makaleye 0 yorum yapıldı

Sohbete katılın!

Düşüncelerinizi ve içgörülerinizi paylaşmak için lütfen giriş yapın

Henüz yorum yok

Düşüncelerinizi paylaşan ilk kişi siz olun!

Bunları da Beğenebilirsiniz

Daha fazla muhteşem içerik keşfedin