alaca33 Migrasyon içinde yaptığınız ilişki veri bütünlüğü (data integrity) için yapılan veritabanı düzeyindeki bir ilişki. Burada amaç kayıtların öksüz kalmasını engellemek. Makaleleriniz var ve bir de ait olduğu kategori var. Burada categories ile articles arasında foreign key ile ilişki kurarken aslında yaptığınız içinde makale olan kategorilerin silinmesini engellemek. Makaleleri olan bir kategoriyi sildiğinizde o makaleler öksüz kalacak ve veri bütünlüğünüz bozulmuş olacak. Makalede karşılığı olmayan bir category_id yer alacak. Bu şekilde makalesi olan bir kategoriyi silmeye çalıştığınızda silemezsiniz, veritabanı düzeyinde hata alırsınız.
Size verdiğim örnekte bir de onDelete('cascade') var. Bu da eğer uygularsanız kategori silinirse altında yer alan makaleleri de sil demek. Bu da kategoriden makaleye doğru yapılan bir veri bütünlüğü önlemi. Yine amaç makalelerin öksüz kalmasını engellemek. Delete Cascade yaptığınızda öksüz kalacağına o da ölsün, yeter ki veri bütünlüğü sağlansın, sistem düzgün şekilde ayakta kalsın demiş oluyorsunuz. Töre gibi bir şey... (Elbette biz genellikle içinde makale olan kategorilerin silinmesine engel oluruz. Eğer yapılması isteniyorsa ona ayrı bir temizle bölümü hazırlanır.)
Laravel'de kurduğunuz ilişki ise, ilişkili kayıtların eklenmesi, güncellenmesi, listelenmesi ve silinmesi işlemlerinin pratik olarak yapılabilmesi için kurulan ilişki.
Ayrıca ilişkiyi de yanlış kurmuşsunuz. Şöyle olması gerekiyor:
class Article extends Model
{
public function category(): HasOne
{
return $this->hasOne(Category::class, 'category_id');
}
}
Özellikle burada getCategory() gibi bir isim vermeniz çok yanlış çünkü bir yöntem getCategory diyorsa karşılığında bir Category geleceği düşünülür fakat hasOne ilişkisi size Category değil Eloquent Builder dönderir. Siz de kategoriye ulaşmak için ya $article->getCategory yapıp direkt Category alırsınız ya da $article->getCategory()->get() yaparsınız. Gördüğünüz gibi bu isimlendirme garip duruyor. Doğru olanı $article->category ya da $article->category()->get() 'dir. Bu tür şeylere dikkat etmeniz lazım.
Konuyla ilgili şu konuları inceleyin:
https://laravel.gen.tr/d/3868-anasayfayi-kategori-gridlere-bolme
https://laravel.gen.tr/d/3681-laravel-otomatik-veri-ekleme
Not: Herkesin tercihine saygı duyuyorum ama modelleri Models klasörü içerisine almanın ne faydası var hiç anlayamadım. Laravel 5 ile models klasörü kalktığında çok sevinmiştim. Ben app klasörüne girdiğim zaman modelleri gördüğümde uygulamanın (yani app, application) kendisini gördüğümü hissediyorum çünkü onlar zaten uygulamanın ana bileşenleri. app klasörüne bakıp hiçbir model görmediğimde ise bu ne acaba diyesim geliyor. Sanki bir uygulamadan ziyade Şu İşi Yapan Laravel gibi bir his oluşturuyor. Bu benim kişisel düşüncem, modelleri Models klasörüne almanızın hiçbir sakıncası yok, yanlış anlaşılmasın.