Laravel Polymorphic One To Many Relation

Merhaba Mobilhanem.com 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 Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    /**
     * Get all of the post's comments.
     */
    public function comments()
    {
        return $this->morphMany('App\Comment', 'commentable');
    }
}

 

Video model dosyası:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Video extends Model
{
    /**
     * Get all of the video's comments.
     */
    public function comments()
    {
        return $this->morphMany('App\Comment', 'commentable');
    }
}

 

Comment model dosyası:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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 = App\Video::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

 

polymorphic one to many relation
polymorphic one to many relation

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 = App\Comment::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.

Mobilhanem.com 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.

Mobilhanem.com ü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.mobilhanem.com 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

Onur Üre

Aslen jeoloji mühendisi olup hiç mesleğini yapmaya fırsat bulamayan ve gönlünde hep bilgisayar ve programlama olan, evden (home-office) çalışma şekline bayılan, evli, 2 kedi ve 1 tavşan babası, sokaktaki her köpek, kedi, kuşun abisi olmaya çalışan biriyim. Lütfen bir kap su bir kap yemek her köşe başına...

Yorum Yaz

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?