Laravel’de Veritabanı İlişkileri (Relationships) İşlemleri

tarafından
1147
Laravel’de Veritabanı İlişkileri (Relationships) İşlemleri
Güzel Hosting

Bütün yazılımcıların en çok zaman alan işlemlerinden birisidir, veritabanında yaptığımız işlemler. Aslında yapmış olduğumuz projenin temeli de bu ilişkilere dayanmaktadır. Bu ilişkiler sayesinde projemiz hayat bulur ve işleyişini stabilitesini bu şekilde korur. Bundan dolayı projelerimizde yapmamız gereken iki kere düşünüp bir kere yazmak olacaktır. Çünkü doğru tasarlanmayan bir veritabanı ilişkileri zincirleme olarak birbirini etkileyebilmeye kadar gidebilir. Tabi ki yaptığımız her veritabanı ilişki hataları size artı bir tecrübe kazandıracağını unutmamanız gerekiyor. Çünkü hepimiz bu işlere başladığımızda hatalarla karşılaştık hatta yaptığımız hatalara bizler bile şaşırdık ama yılmadık sürekli çalıştık ve en doğru stabil veritabanı ilişkisine ulaşabildik. Unutmadan yukarıda anlatmış olduğum tüm işlemler yazılım kültüründe temelinde algoritma geçmektedir. Algoritmik zekanızı her zaman geliştirebilecek fikirler bularak düşünmenizi tavsiye ederim. Gelelim Laravel’de veritabanı ilişkilerine, bu normal SQL sorgularında inner,left,right join olarak geçiyor ama bu laravel’de daha kolay ve işlevsel bir hale getirilmiş durumdadır. Hadi gelin birlikte laravel’de veri tabanı ilişkilerine göz atalım.

One To One

Bu ilişki türümüz temel seviye ilişki bire bir ilişki olarak adlandırıyoruz Türkçe’de, bu ilişki türüne bir örnek gösterecek olursak bir kullanıcımız mevcut bu kullanıcımızın özgeçmiş’ini tutuyoruz ve her kullanıcımızın bir özgeçmişi olabiliyor ve her özgeçmiş bir kullanıcıya ait olabilir. İlişkilerini kurabilmek için Özgeçmiş tablomuza bir user_id adında bir kolon ile bu işlemleri çok basit bir şekilde yapabiliriz.
Hemen ilişki kuralım bunun için User modelimize giderek alt kısımdaki kod’u ekliyoruz.

public function ozgecmis(){
    return $this->hasOne('App\Ozgecmis');
}
// Üst kısımdaki kod'a alt kısımdaki gibi tamamlama ekleyebiliriz.
// Eklemediğimiz durumlarda laravel foreign_key kısmını model ismini alarak sonuna _id ekliyor yani User modelini snake case'e çevirerek user_id olarak kontrol ediyor local_key ise direk olarak id kabul ediyor bu durum sizde değiştiği durumlarda alt kısımdaki gibi modifiye ederekte kullanım yapabilirsiniz.
public function ozgecmis(){
    return $this->hasOne('App\Ozgecmis', 'user_id', 'id');
}

Bu kod ile kullanıcımızın özgeçmişine direk olarak ulaşabiliriz.

BelongsTo

BelongsTo ‘yu Türkçe’ye çevirdiğimizde kelime anlamı ait olmak gibi düşünebiliriz. Daha açıklayıcı olursak sahiplik bulma amacıyla kullanılmaktadır. Yani bu özgeçmiş hangi kullanıcıya ait gibi düşünebiliriz.
Hemen ilişki kuralım bunun için Ozgecmis modelimize giderek alt kısımdaki kod’u ekliyoruz.

public function user(){
    return $this->belongsTo('App\User');
}
// Üst kısımdaki kod'a alt kısımdaki gibi tamamlama ekleyebiliriz.
// Eklemediğimiz durumlarda laravel foreign_key kısmını fonksiyon ismini alarak sonuna _id ekliyor yani User fonksiyonunu snake case'e çevirerek user_id olarak kontrol ediyor local_key ise direk olarak id kabul ediyor bu durum sizde değiştiği durumlarda alt kısımdaki gibi modifiye ederekte kullanım yapabilirsiniz.
public function user(){
    return $this->belongsTo('App\User', 'user_id', 'id');
}

One To Many

Bu ilişkideki işlemimiz bire çok ilişki düşünmemiz gereken nokta bir kullanıcımız var ve bu kullanıcımız makaleler yazıyor. Yani bir kullanıcımız birden çok makaleye sahip olabilirken, bir makalemiz sadece bir kullanıcıya ait olabiliyor.
Hemen ilişki kuralım bunun için User modelimize giderek alt kısımdaki kod’u ekliyoruz.

public function makalaleler(){
    return $this->hasMany('App\Makale');
}
// Fonksiyon ismine çoklu veriye ulaşacağımızda çogul tamlama eklememiz gerekmektedir.
// Üst kısımdaki kod'a alt kısımdaki gibi tamamlama ekleyebiliriz.
// Eklemediğimiz durumlarda laravel foreign_key kısmını fonksiyon ismini alarak sonuna _id ekliyor yani user modelini snake case'e çevirerek user_id olarak kontrol ediyor local_key ise direk olarak id kabul ediyor bu durum sizde değiştiği durumlarda alt kısımdaki gibi modifiye ederekte kullanım yapabilirsiniz.
public function makalaleler(){
    return $this->hasMany('App\Makale', 'user_id', 'id');
}

İlgili verilere ise alt kısımdaki kod ile de ulaşabiliriz.

$makaleler= App\User::find(1)->makaleler;
foreach ($makaleler as $makale) {
    //
}

Bir makalenin kullanıcıya ait olduğunu ise BelongsTo ilişki yöntemiyle ulaşabiliriz.

Many To Many

Bu ilişki yönetiminde ise çoka çok ilişki yöntemi düşünmemiz gerekirse bir e-ticaret sisteminde birden fazla kullanıcı olabileceği gibi birden fazlada ürün olabilir ve bir kullanıcı birden fazla ürün alabilir. Bir ürün ise birden fazla kullanıcıya satılabilir. Bu işlemleri yapabilmemiz için aracı bir tabloya ihtiyaç duymaktayız. Bu aracı olan tablomuza pivot tablo diyoruz. Bu tabloda bir model’e ihtiyaç duymamaktayız. Fakat size kalmış bir model ile kontrol edebilirsiniz. Bu tablo’ya isim verirken iki modeli snake case’e çevirerek birleştirmemiz işimizi laravel otomatik işlemlerde kolaylaştıracaktır. Örneğin bizim anlattığımız ilişkide Urun ve User tablolalarımız mevcut burada tablo adını urun_user olarak belirlememiz uygun olacaktır. Bu tablo içerisinde user_id ve urun_id kolonları olması yeterli olacaktır. Aslında bu tablomuzu sipariş tablosu gibi de düşünebiliriz.
Hemen ilişki kuralım bunun için User modelimize giderek alt kısımdaki kod’u ekliyoruz.

public function urunler(){
    return $this->BelongsToMany('App\Urun');
}
// Fonksiyon ismine çoklu veriye ulaşacağımızda çogul tamlama eklememiz gerekmektedir.
// Üst kısımdaki kod'a alt kısımdaki gibi tamamlama ekleyebiliriz.
// Bu işlemi laravel otomatik olarak User ve Urun modelini arasında bir ilişki kuracağımız için iki model ismini alarak snake case çeviriyor ve iki kolonuda sonlarına _id ekleyerek tamlamasını yapıyor. Burada ilk belirteceğimiz kolon mevcut bulunduğumuz modeli ilgilediren kolondur. Biz şuanda User modelinde çalıştığımız için ilk kolon user_id olarak belirtiyoruz.
public function urunler(){
    return $this->belongsToMany('App\Urun', 'urun_user', 'user_id', 'urun_id');
}

İlgili verilere ise alt kısımdaki kod ilede ulaşabiliriz.

$siparisler = App\User::find(1)->siparisler;
foreach ($siparisler->urunler as $siparis) {
    //Burada sipariş olarak belirtim çünkü sipariş kurduğumuz ilişkide sipariş tablosu olarak düşünebiliriz.
    //Kullanıcımızın verdiği sipariş ürünlerine bu şekilde ulaşabiliriz.
}

Belongs To Many

Bu ilişki yönetiminde ise çoka çok ilişki yöntemimizin tam tersi ilişki yani bu urunu hangi kullanıcılar sipariş vermiş gibi düşünebiliriz. Aslında aynı işlem sadece dikkat etmemiz gereken nokta tamlamalarda kolon isimlerinin sıralamasıdır.
Hemen ilişki kuralım bunun için Urun modelimize giderek alt kısımdaki kod’u ekliyoruz.

public function user(){
    return $this->BelongsToMany('App\User');
}
// Fonksiyon ismine çoklu veriye ulaşacağımız da çoğul tamlama eklememiz gerekmektedir.
// Üst kısımdaki kod'a alt kısımdaki gibi tamamlama ekleyebiliriz.
// Bu işlemi laravel otomatik olarak User ve Urun modelini arasında bir ilişki kuracağımız için iki model ismini alarak snake case çeviriyor ve iki kolonuda sonlarına _id ekleyerek tamlamasını yapıyor. Burada ilk belirteceğimiz kolon mevcut bulunduğumuz modeli ilgilediren kolondur. Biz şuanda Urun modelinde çalıştığımız için ilk kolon urun_id olarak belirtiyoruz.
public function user(){
    return $this->belongsToMany('App\User', 'urun_user', 'urun_id', 'user_id');
}

İlgili verilere ise alt kısımdaki kod ilede ulaşabiliriz.

$urunler= App\Urun::find(1);
foreach ($urunler->user as $user) {
    //Burada ise 1 id'sine sahip ürünü hangi kullanıcıların aldığını sıralayabiliriz.
}

Many To Many Pivot

Bunda anlatacağımız işlem bir ilişki değil sadece pivot tablomuza ekleyeceğimiz kolonların gösterileceği hakkında çünkü laravel sadece ilişkili olduğunu kolon tabloları gösterimini yapmaktadır. Örneğin kullanıcımız bir ürün alıyor ama bu ürünü ne zaman aldığını veya hangi kargo şirketi ile aldığını biz bu ara tablo (pivot) tablomuzda tutmak istiyoruz bunun için alt kısımdaki kod’a başvurabiliriz.

public function urunler(){
    return $this->BelongsToMany('App\Urun')->withTimestamps();
// withTimestamps ile gösterime timestamps'leride ekleyebiliriz.
}

Özel bir kolon açıp göstermek istersek alt kısımdaki gibi kullanabiliriz.

public function urunler(){
    return $this->BelongsToMany('App\Urun')->withPivot('kargo');
// Bu şekilde ise kargo kolonunu gösterime ekleyebiliriz.
}

Has Many Through

Through kelime anlamıyla aracılığıyla olarak adlandırabiliriz. Bu ilişkide düşünmemiz gerekirse sehirler adında bir tablomuz olsun ve kullanıcılarımızın da her biri bir şehir’e ait olsun. Bu işlemi yapabilmemiz için tabi ki kullanıcılarımız bulunduğu tabloya sehir_id adında bir kolon açarak sehir tablosuyla ilişki kurabileceğimiz bir işlem yapmamız gerekiyor. Bizim istediğimiz İstanbul olarak sehir_id kolonunda belirtilmiş kullanıcılarımızın makalelerine ulaşalım. Yani belirtiğimiz şehir ile kullanıcılara ulaşıp, buradan ise makalelere ulaşmak istiyoruz, burada kullanıcılar tablomuzu aracı olarak kullanacağız.

Hemen ilişki kuralım bunun için Sehir modelimize giderek alt kısımdaki kod’u ekliyoruz.

public function makaleler(){
    return $this->hasManyThrough('App\Makale', 'App\User');
    // İlk önce ulaşmak istediğimiz model diğeri ise bize bu modele ulaşırken aracılık edecek olarak model.
}
// Fonksiyon ismine çoklu veriye ulaşacağımız da çoğul tamlama eklememiz gerekmektedir.
// Üst kısımdaki kod'a alt kısımdaki gibi tamamlama ekleyebiliriz.
// Bu işlemi laravel otomatik olarak User ve Makale modelini arasında bir ilişki kuracağımız için iki model ismini alarak snake case çeviriyor ve iki kolonuda sonlarına _id ekleyerek tamlamasını yapıyor.
public function makaleler(){
        return $this->hasManyThrough(
            'App\Makale', 'App\User',
            'sehir_id', 'user_id', 'id'
        );
    // İlk önce ulaşmak istediğimiz model diğeri ise bize bu modele ulaşırken aracılık edecek olarak model.
    // Tamlamada ise aracı model ve mevcut model ile ilişkili olan kolon adı (sehir_id) yani kullanicilar tablosunuda tuttuğumuz kolon, ikinci ise ulaşmak istediğimiz aracı tablo ile ilişkili olan kolon ismi olarak adlandırabiliriz. Yani makaleler tablosunda yer alan user_id kolonu. Son tamlama ise local id'dir.
}

Bol bol veritabanı ilişkilerine çalışmanızı tavsiye ederim bu şekilde yazılım algoritmanız daha gelişecektir.
Bir sonraki makalemizde Polymorphic ilişkilerden bahsedeceğim.
Daha ayrıntılı bilgi için laravel dökümantasyonunu inceleyebilirsiniz.
Yararlı olabildiysem ne mutlu, Hatam var ise bildirilirse düzeltebilirim.