Laravel Polymorphic Many to Many Relation

Merhaba Mobilhanem.com takipçileri,
Bu yazımda sizlere daha önce bahsettiğim many to many ilişkisinin daha karmaşık hali olan Polymorphic Many To Many Relation ilişkisini hakkında yazacağım. Sizin yorumlarınız çok önemli lütfen paylaşım ve yorumlarınızı bizden esirgemeyin.

Laravel Eloquent Polymorphic Many To Many Relation Nedir?

İki ders önce bahsettiğimiz örnekten devam edersek eğer orada one to one ilişkisi kurarak bir Post ve Video nun sadece bir Category değeri olacağını planlamıştık. Bu örnekte ise Post ve Video ların birden fazla Category ile eşleşebildiği durumu örneklendireceğiz. Yine Posts, Videos ve Categories olarak 3 ayrı tablomuz olsun. Bu ilişkide daha önceki yazılarımda yer alan many to many ilişkisi geçerlidir. Yine polymorphic ilişkideki farkı bunun iki değil üç tablo arasında kurulan bir ilişki olmasıdır.

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 Category -m

 

yazıyor ve migration tablosu içerisine

 

$table->string('title');

 

yazarak tablomuzu oluşturuyoruz. Burada bize modeli olmayan bir tablo daha lazım bunun için de komut satırına

php artisan make:migration create_categoryables_table

yazıp migration dosyamızı oluşturuyoruz.

Migration dosyamızda ise diğerlerinden farklı olarak id tanımlamıyoruz bunun yerine size tüm up fonksiyonunu kopyalıyorum

 

    public function up()
    {
        Schema::create('categoryables', function (Blueprint $table) {
            $table->integer('category_id');
            $table->integer('categoryable_id');
            $table->string('categoryable_type');
        });
    }

 

Tüm migrationlarımız hazır. Veritabanımızı

php artisan migrate

ile güncelliyoruz.

Ş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
{
    
    public function categories()
    {
        return $this->morphToMany('App\Category', 'categoryable');
    }
}

 

Video model dosyası:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Video extends Model
{
    public function categories() { 
        return $this->morphToMany('App\Category', 'categoryable'); 
    }
}

 

Category model dosyası:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    /**
     * Get all of the posts that are assigned this category.
     */
    public function posts()
    {
        return $this->morphedByMany('App\Post', 'categoryable');
    }

    /**
     * Get all of the videos that are assigned this category.
     */
    public function videos()
    {
        return $this->morphedByMany('App\Video', 'categoryable');
    }
}

 

Yukarıdaki kodları sisteme ekledikten sonra Post ya da Video tablosuna bağlı Category bilgi ya da bilgilerini çekmek içinse

 

$post = App\Video::find(1);

//UNUTMAYIN Kİ BU BİR MANY TO MANY İLİŞKİSİ YANİ İLİŞKİDEN DÖNEN VERİ ARRAY ŞEKLİNDE OLACAKTIR

foreach ($post->categories as $category) {
    
}

 

kodunu kullanabiliriz. Bu şekilde Video ya ait Category veri ya da verilerini listeleyebiliriz. Dönen veri array şekilde olacağı için buna mutlaka dikkat etmelisiniz.

Örnek olarak;

polymorphic many to many relation

 

polymorphic many to many relation
polymorphic many to many relation

Polymorphic Many To Many Relation Ters Bağlantısı

Diğer ilişki çeşitlerinde olduğu gibi bu ilişkide de Post/Video bulduktan sonra Categories bilgisine ulaşabildiğimiz gibi Category den de Post/Video bilgilerine ulaşabiliriz.

Bunu yapmak gerekli kod;

 

$category = App\Category::find(1);

foreach ($category->videos as $video) {
    //
}

 

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…

2

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

2 Yorum

Haftalık Bülten

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