Laravel Eloquent ORM ile Veritabanı Sihirbazlığı: İlişkiler ve Eager Loading 
Selam dostlar!
Uzun zamandır forumda backend tarafında takılıyorum ve özellikle Laravel'in en güçlü silahlarından biri olan Eloquent ORM'de yeni başlayanların veya biraz daha derine inmek isteyenlerin sıkça takıldığı bir konuya değinmek istedim: ilişkiler (Relations) ve Eager Loading. Bu ikisini doğru kavradığınızda, veritabanı işlemleriniz gerçekten bir sihir gibi hızlı ve temiz hale geliyor. Hadi başlayalım! 
Eloquent İlişkiler Nedir ve Neden Önemli?
Basitçe söylemek gerekirse, Eloquent ilişkiler, veritabanınızdaki tablolar arasındaki bağlantıları (one-to-one, one-to-many, many-to-many) PHP nesneleri üzerinde tanımlamanızı ve yönetmenizi sağlayan metodlardır. Manuel SQL JOIN'ler yazmak yerine, `$user->posts` gibi çok daha okunabilir ve kullanışlı bir syntax sunar.
Temel İlişki Türleri ve Tanımlama
En yaygın ilişki türlerini hızlıca gözden geçirelim:
N+1 Sorgu Problemi ve Kurtarıcı: Eager Loading
İşin en can alıcı kısmı burası!
Diyelim ki 10 kullanıcımız var ve her birinin yazılarını listelemek istiyoruz. Saf yöntemle şöyle yapardık:
Toplam: 1 (kullanıcılar) + 10 (her kullanıcı için posts) = 11 sorgu! İşte bu ünlü N+1 sorgu problemi. Performans katili!
Çözümü ise Eager Loading. İlişkili veriyi tek bir (veya birkaç) ana sorguyla önceden yüklemek.
Gördüğünüz gibi, sorgu sayısı 11'den 2'ye düştü!
Eager Loading'in İleri Seviye Kullanımları
Lazy Eager Loading
Bazen modeli aldıktan sonra ilişkiye ihtiyaç duyarsınız. O zaman `load` metodunu kullanabilirsiniz.
Son Sözler
Eloquent ilişkiler ve Eager Loading, Laravel'de veritabanı ile çalışmayı bir zevk haline getiriyor. Başlangıçta kafa karıştırıcı gelse de, pratik yaptıkça ne kadar güçlü ve verimli olduğunu göreceksiniz. Yeni bir projeye başlarken veya mevcut bir kodu optimize ederken, mutlaka "Acaba burada N+1 sorgu problemi var mı?" diye kendinize sorun ve `with()` metodunu kullanmaya özen gösterin.
Umarım bu rehber faydalı olmuştur. Takıldığınız yerleri yorumlarda sorabilirsiniz. Bir sonraki yazıda görüşmek üzere, kodlamaya devam!

Selam dostlar!
Eloquent İlişkiler Nedir ve Neden Önemli?
Basitçe söylemek gerekirse, Eloquent ilişkiler, veritabanınızdaki tablolar arasındaki bağlantıları (one-to-one, one-to-many, many-to-many) PHP nesneleri üzerinde tanımlamanızı ve yönetmenizi sağlayan metodlardır. Manuel SQL JOIN'ler yazmak yerine, `$user->posts` gibi çok daha okunabilir ve kullanışlı bir syntax sunar.
Temel İlişki Türleri ve Tanımlama
En yaygın ilişki türlerini hızlıca gözden geçirelim:
- One To One: Bir kullanıcının bir profili vardır.
Kod:// User Modelinde public function profile() { return $this->hasOne(Profile::class); } // Kullanımı: $user = User::find(1); $profile = $user->profile; - One To Many: Bir kullanıcının birçok yazısı vardır (klasik blog örneği).
Kod:// User Modelinde public function posts() { return $this->hasMany(Post::class); } // Kullanımı: foreach($user->posts as $post) { ... } - Many To Many: Bir yazının birçok etiketi, bir etiketin birçok yazısı vardır. Bu genellikle bir pivot tablo gerektirir.
Kod:// Post Modelinde public function tags() { return $this->belongsToMany(Tag::class); } // Kullanımı: $post->tags()->attach($tagId);
N+1 Sorgu Problemi ve Kurtarıcı: Eager Loading
İşin en can alıcı kısmı burası!
Kod:
$users = User::all(); // 1 sorgu: "SELECT * FROM users"
foreach ($users as $user) {
echo $user->posts->count(); // Her döngüde YENİ bir sorgu: "SELECT * FROM posts WHERE user_id = ?"
}
Toplam: 1 (kullanıcılar) + 10 (her kullanıcı için posts) = 11 sorgu! İşte bu ünlü N+1 sorgu problemi. Performans katili!
Çözümü ise Eager Loading. İlişkili veriyi tek bir (veya birkaç) ana sorguyla önceden yüklemek.
Kod:
// Eager Loading ile
$users = User::with('posts')->get(); // Sadece 2 sorgu atar!
// 1. "SELECT * FROM users"
// 2. "SELECT * FROM posts WHERE user_id IN (1, 2, 3, ...)"
foreach ($users as $user) {
echo $user->posts->count(); // Veri bellekte, yeni sorgu YOK!
}
Gördüğünüz gibi, sorgu sayısı 11'den 2'ye düştü!
Eager Loading'in İleri Seviye Kullanımları
- Birden Fazla İlişkiyi Yükleme: `User::with('posts', 'profile', 'roles')->get()`
- İç İçe (Nested) Eager Loading: Kullanıcıların yazılarını ve o yazıların yorumlarını çekmek isterseniz: `User::with('posts.comments')->get()`
- Belirli Sütunları Seçme: Tüm veriyi çekmek istemeyebilirsiniz. Performans için sadece ihtiyacınız olan sütunları seçin.
Kod:User::with(['posts' => function ($query) { $query->select('id', 'title', 'user_id'); // user_id ilişki için ŞART! }])->get(); - Koşullu Eager Loading: Sadece onaylanmış yazıları yükleyelim.
Kod:User::with(['posts' => function ($query) { $query->where('is_approved', true); }])->get();
Lazy Eager Loading
Bazen modeli aldıktan sonra ilişkiye ihtiyaç duyarsınız. O zaman `load` metodunu kullanabilirsiniz.
Kod:
$user = User::find(1);
// ... bazı işlemler ...
if ($birKosul) {
$user->load('posts'); // İhtiyaç anında yükle!
}
Son Sözler
Eloquent ilişkiler ve Eager Loading, Laravel'de veritabanı ile çalışmayı bir zevk haline getiriyor. Başlangıçta kafa karıştırıcı gelse de, pratik yaptıkça ne kadar güçlü ve verimli olduğunu göreceksiniz. Yeni bir projeye başlarken veya mevcut bir kodu optimize ederken, mutlaka "Acaba burada N+1 sorgu problemi var mı?" diye kendinize sorun ve `with()` metodunu kullanmaya özen gösterin.
Umarım bu rehber faydalı olmuştur. Takıldığınız yerleri yorumlarda sorabilirsiniz. Bir sonraki yazıda görüşmek üzere, kodlamaya devam!