Merhaba Phphocasi.com.tr 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 IlluminateDatabaseEloquentModel; class Post extends Model { public function categories() { return $this->morphToMany("AppCategory", "categoryable"); } }
Video model dosyası:
<?php namespace App; use IlluminateDatabaseEloquentModel; class Video extends Model { public function categories() { return $this->morphToMany("AppCategory", "categoryable"); } }
Category model dosyası:
<?php namespace App; use IlluminateDatabaseEloquentModel; class Category extends Model { /** * Get all of the posts that are assigned this category. */ public function posts() { return $this->morphedByMany("AppPost", "categoryable"); } /** * Get all of the videos that are assigned this category. */ public function videos() { return $this->morphedByMany("AppVideo", "categoryable"); } }
Yukarıdaki kodları sisteme ekledikten sonra Post ya da Video tablosuna bağlı Category bilgi ya da bilgilerini çekmek içinse
$post = AppVideo::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](https://www.phphocasi.com.tr2019/09/polymorphic-many-to-many-relation-2.png)
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 = AppCategory::find(1); foreach ($category->videos as $video) { // }
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…
2