Laravel’deki ilişkiler, en önemli kavramlardan biridir.
Eloquent İlişkilerini doğru bir şekilde anladığınızda, gerçek dünya uygulamaları oluşturmaya başlamanız çok daha kolay, düzenli ve ölçeklenebilir hale gelir.
Hemen hemen her uygulama, bağlantılı verilere bağımlıdır.
Örneğin:
- Bir kullanıcı gönderi oluşturur
- Bir gönderinin yorumları vardır
- Bir sipariş bir müşteriye aittir
- Öğrenciler derslere kaydolur
Karmaşık SQL joinlerini manuel olarak yazmak yerine, Laravel Eloquent ORM üzerinde şık ilişki yöntemleri sunar.
Bu makalede, başlangıç seviyesine uygun örneklerle Laravel’deki en önemli ilişkileri anlayacağız.
Eloquent İlişkileri, modellerin birbirleriyle iletişim kurmasını sağlar.
İlişkileri, veri tabanı tabloları arasındaki bağlantılar olarak düşünün.
Laravel, ilişkilendirilmiş verileri kolayca içe aktarmanızı sağlayan yöntemler sunar.
Örnek:
$user->posts
Manuel olarak SQL joinleri yazmak yerine, Laravel bağlantıyı otomatik olarak sizin için halleder.
Bir One to One ilişkisi şunu ifade eder:
Bir kayıt tam olarak bir başka kayıtla bağlantılıdır.
Örnek
Örnek
Örnek
Örnek
Bir kullanıcının bir profili vardır.
Tablolar
Tablolar
users
profiles
User Model
User Model
public function profile()
{
return $this->hasOne(Profile::class);
}
Profile Model
Profile Model
public function user()
{
return $this->belongsTo(User::class);
}
Kullanım
Kullanım
Kullanım
$user = User::find(1);
$user->profile;
Gerçek Dünya Kullanım Durumları
Gerçek Dünya Kullanım Durumları
- Kullanıcı profil bilgileri
- Çalışan detayları
- Hesap ayarları
Bu, en yaygın kullanılan ilişkidir.
Bu demektir ki:
Bir kayıt birden fazla ilgili kayıtla bağlantılı olabilir.
Örnek
Örnek
Örnek
Örnek
Bir kullanıcı birçok gönderi oluşturabilir.
User Model
User Model
public function posts()
{
return $this->hasMany(Post::class);
}
Post Model
Post Model
public function user()
{
return $this->belongsTo(User::class);
}
Kullanım
Kullanım
Kullanım
$user->posts;
Gerçek Dünya Örnekleri
Gerçek Dünya Örnekleri
- Kullanıcı → Gönderiler
- Kategori → Ürünler
- Gönderi → Yorumlar
- Müşteri → Siparişler
belongsTo(), temelde hasMany() veya hasOne()‘nun tersidir.
Laravel’e şöyle der:
Bu model başka bir modele aittir.
Örnek
Örnek
Örnek
Örnek
Bir gönderi bir kullanıcıya aittir.
Post Model
Post Model
public function user()
{
return $this->belongsTo(User::class);
}
Kullanım
Kullanım
Kullanım
$post->user;
Laravel, tablo içinde:
user_id
adı altında otomatik olarak arama yapar.
Bu ilişki, her iki modelin de birbirleriyle birden fazla bağlantıya sahip olabileceği durumlarda kullanılır.
Örnek
Örnek
Örnek
Örnek
- Bir öğrenci birçok derse katılabilir
- Bir ders birçok öğrenciyi içerebilir
Student Model
Student Model
public function courses()
{
return $this->belongsToMany(Course::class);
}
Course Model
Course Model
public function students()
{
return $this->belongsToMany(Student::class);
}
Many to Many ilişkileri, bir pivot tablosu gerektirir.
Örnek:
course_student
Bu tablonun içinde saklanır:
student_id
course_id
$student->courses;
veya
$course->students;
Gerçek Dünya Örnekleri
Gerçek Dünya Örnekleri
- Roller ↔ Kullanıcılar
- Ürünler ↔ Etiketler
- Öğrenciler ↔ Dersler
- Filmler ↔ Aktörler
Bu ilişki, başka bir model aracılığıyla verilere erişim sağlar.
Örnek
Örnek
Örnek
Örnek
Bir Ülkenin, Kullanıcılar aracılığıyla birçok Gönderisi vardır.
Yapı
Yapı
Country → Users → Posts
Manuel olarak tabloları birleştirmek yerine, Laravel bunu otomatik olarak yönetir.
Örnek
Örnek
public function posts()
{
return $this->hasManyThrough(
Post::class,
User::class
);
}
Kullanışlı Olur
Kullanışlı Olur
- Şirket → Çalışanlar → Görevler
- Okul → Öğrenciler → Sonuçlar
- Ülke → Kullanıcılar → Gönderiler
Bu ilişki, biraz daha ileri düzeydir ama çok güçlüdür.
Laravel ilişkileri, yabancı anahtarlar üzerine yoğun bir şekilde inşa edilmiştir.
Örnek:
users table → id
posts table → user_id
Laravel, otomatik olarak adlandırma kurallarını varsayılan olarak alır:
model_name_id
Bu nedenle, Laravel kurallarına uymak, zaman kazandırır.
İlişkilerle ilgili en önemli kavramlardan biri Eager Loading’dir.
N+1 Sorgu Problemi
N+1 Sorgu Problemi
Şunu hayal edin:
$posts = Post::all();
foreach ($posts as $post) {
echo $post->user->name;
}
Laravel şu sorguları çalıştırır:
- Posts için 1 sorgu
- Kullanıcılar için birden fazla sorgu
Bu, performans sorunları yaratır.
$posts = Post::with('user')->get();
Şimdi Laravel, her şeyi daha az sorguyla verimli bir şekilde yükler.
Faydalar
Faydalar
- Daha iyi performans
- Daha hızlı uygulamalar
- Azaltılmış veritabanı yükü
Ölçeklenebilir uygulamalar geliştiriyorsanız, eager loading şarttır.
Yeni başlayanların yaptığı bazı hatalar şunlardır:
1. Yanlış Yabancı Anahtar İsimleri
1. Yanlış Yabancı Anahtar İsimleri
Laravel şunları bekler:
user_id
Farklı isimler kullanıyorsanız, bunları manuel olarak tanımlamanız gerekir.
2. İlişki Yöntemlerini Unutmak
2. İlişki Yöntemlerini Unutmak
Bu yanlış:
$user->posts()
Genellikle istediğiniz budur:
$user->posts
İlki ilişki sorgu oluşturucuyu döndürür.
İkincisi ise gerçek verileri döndürür.
3. Eager Loading Kullanmamak
3. Eager Loading Kullanmamak
Yeni başlayanlar sık sık unutuyor:
with()
Bu, uygulamaları kötü bir şekilde yavaşlatabilir.
4. Pivot Tabloların Eksik Olması
4. Pivot Tabloların Eksik Olması
Many to Many ilişkileri, pivot tablosu olmadan düzgün çalışmaz.
Eloquent İlişkileri, Laravel’in en güçlü özelliklerinden biridir.
Bir kez ustalaştığınızda:
- Kodunuz daha temiz hale gelir
- Veritabanı sorguları daha kolay hale gelir
- Uygulamalar daha ölçeklenebilir hale gelir
- Geliştirme süreci daha hızlı olur
Laravel öğreniyorsanız, küçük projelerle ilişkileri pratiğe geçirip zaman harcayın.
İşte burada her şey bağlantı kurmaya başlıyor.
Şunları denemek için yapmak:
- Blog sistemi
- Görev yöneticisi
- Öğrenci kurs portalı
- E-ticaret mini projesi
Ve uygulamak:
- One to One
- One to Many
- Many to Many
Pratik, ilişkileri derinlemesine anlamanın en hızlı yoludur.
Laravel ilişkileri, tekrar eden SQL sorgularını manuel olarak yazmanın acısını ortadan kaldırır.
Geliştiricilere daha fazla uygulama mantığına odaklanma ve veritabanı karmaşasından daha az etkilenme fırsatı sunar.
Basit başlayın.
Tutarlı bir şekilde pratik yapın.
Ve ilişkiler sonunda doğal hale gelecektir.
İyi kodlamalar!
Kaynak: Orijinal Makale


