Merhaba Phphocasi.com.tr takipçileri,
Bu yazımda sizlere daha önce bahsettiğim one to many ilişkisinin daha karmaşık hali olan Polymorphic One To Many Relation ilişkisini hakkında yazacağım. Bu arada yazdığınız yorumlara teşekkür ederim. Her yorumunuza hızlı bir şekilde cevap vermeye çalışıyorum. Sizin yorumlarınız çok önemli lütfen paylaşım ve yorumlarınızı bizden esirgemeyin.
Laravel Eloquent Polymorphic One To Many Relation Nedir?
Laravel dökümanında verilen örnekten yola çıkalım. Posts, Videos ve Comments olarak 3 ayrı tablomuz olduğunu varsayalım. Bu ilişkide daha önceki yazılarımda yer alan one to many ilişkisi geçerlidir. Sadece farkı bunun iki değil üç tablo arasında kurulan bir ilişki olmasıdır. En önemli ve polymorphic one to one ilişkisinden farklı olarak comments tablosunda aynı post/video a ait birden fazla comment bulunabilir.
Polymorphic One To Many Relation Bağlantısı
Yukarıdaki örnekten devam etmek gerekirse öncelikle bir Post ve bir de Video model ve migration larını hazırlayalım.
php artisan make:model Post -m php artasan make:model Video -m
kodunu yazarak Post ve Video adında modeller ve bu modellere bağlı migration dosyalarını oluşturuyoruz. Oluşturduğumuz Post ve Video migration dosyalarının içerisine
$table->string("title"); $table->text("detail");
yazarak Post ve Video tablolarını basit bir şekilde oluşturuyoruz. Daha sonra ise Categories tablosunu hazırlamak için
php artasan make:model Comment -m
yazıyor ve migration tablosu içerisine
$table->string("title"); $table->int("commentable_id"); $table->string("commentable_type);
yazarak tablomuzu oluşturuyoruz. Comments tablosunda yer alan commentable_id Post veya Video nun id bilgisi olmalı. commentable_type ise ilişkinin oluşturulacağı Model i belirtir.
Şimdi de oluşturduğumuz modeller içinde bu ilişkiyi nasıl sağladığımıza bakalım.
Post model dosyası
<?php namespace App; use IlluminateDatabaseEloquentModel; class Post extends Model { /** * Get all of the post"s comments. */ public function comments() { return $this->morphMany("AppComment", "commentable"); } }
Video model dosyası:
<?php namespace App; use IlluminateDatabaseEloquentModel; class Video extends Model { /** * Get all of the video"s comments. */ public function comments() { return $this->morphMany("AppComment", "commentable"); } }
Comment model dosyası:
<?php namespace App; use IlluminateDatabaseEloquentModel; class Comment extends Model { /** * Get the owning commentable model. */ public function commentable() { return $this->morphTo(); } }
Modeller ile elequent bağlantımızı bu şekilde ayarladıktan sonra tabloların veritabanına yazılması için gerekli olan
php artisan migrate
kodu çalıştırıyoruz.
Yukarıdaki kodları sisteme ekledikten sonra Post ya da Video tablosuna bağlı Comment bilgi ya da bilgilerini çekmek içinse
$post = AppVideo::find(1); //UNUTMAYIN Kİ BU BİR ONE TO MANY İLİŞKİSİ YANİ İLİŞKİDEN DÖNEN VERİ ARRAY ŞEKLİNDE OLACAKTIR foreach ($post->comments as $comment) { }
kodunu kullanabiliriz. Bu şekilde Video ya ait Comment veri ya da verilerini listeleyebiliriz. Dönen veri array şekilde olacağı için buna mutlaka dikkat etmelisiniz
Örnek olarak;
Polymorphic One To Many Relation Ters Bağlantısı
Diğer ilişki çeşitlerinde olduğu gibi bu ilişkide de Post/Video bulduktan sonra Comments bilgisine ulaşabildiğimiz gibi Comments den de Post/Video bilgilerine ulaşabiliriz. (Burada örnek çok mantıklı olmasa da bir yerde işinize yarayabilir)
Bunu yapmak gerekli kod;
$comment = AppComment::find(1); $commentable = $comment->commentable;
Bir önceki polymorphic ilişki de olduğu gibi herhangi bir Post / Video belirtmeden Comment modelindeki commentable_type ve commentable_id verileri ile istediğimiz bilgilere ulaşıyoruz.
Phphocasi.com.tr için yazdığım bu yazı umarım yardımcı olur. Daha fazla detaylı bilgi için laravel dökümanından yararlanabilirsiniz.
Tüm Laravel Derslerimiz için tıklayınız.
Phphocasi.com.tr üzerinden yayınladığım laravel eğitimlerine devam edeceğiz. Yazımız ile ilgili tüm sorularınızı yorum bölümden ulaştırabilirsiniz. Bunun dışındaki diğer sorularınız için sorucevap.phphocasi.com.tr sitesini kullanabilirsiniz.
Umarım sizin için yararlı olmuştur. Okuduğunuz için teşekkürler. Daha fazla kişinin okuması için paylaşmayı unutmayın…
30