Yazılım Geliştirme

Laravel’de MorphMany ile Media Yönetimi

📅 Feb 02, 2026
Web projelerinde genellikle farklı modellerin ortak olarak medya (resim, video, dosya) kullanması gerekir.

Örneğin bir Blog modeli ve bir Post modeli hem fotoğraf hem video gibi medya içeriklerini alabilir.

Laravel’in polimorfik ilişkileri burada devreye girer. MorphMany, bir modelin birden fazla polimorfik ilişkili veriyi (örneğin Media) tutmasını sağlar.

Neden MorphMany Kullanıyoruz?

  • Tek bir tablo (media) ile Blog ve Post modellerine ait tüm medya öğelerini yönetebiliriz.
  • Kod tekrarını azaltır, her model için ayrı tablo oluşturmaya gerek kalmaz.
  • Eloquent ilişkileri ile veriyi kolayca çekebilir, ekleyebilir veya silebiliriz.

Nasıl Çalışıyor?

  1. Media Modeli → Hangi modele ait olduğunu bilmek için mediable_id ve mediable_type alanlarını kullanır.
  2. Blog ve Post Modelleri → morphMany() ile birden fazla medya öğesi ekleyebilir.
  3. DB Migration → morphs('mediable') kullanarak gerekli kolonları oluştururuz.
Media Modeli (Polimorfik)
                                     <?php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Media extends Model
{
protected $fillable = ['url', 'type'];

public function mediable()
{
return $this->morphTo();
}
}
Blog ve Post Modelleri (MorphMany)
                                     <?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Blog extends Model
{
public function media()
{
return $this->morphMany(Media::class, 'mediable');
}
}

class Post extends Model
{
public function media()
{
return $this->morphMany(Media::class, 'mediable');
}
}
Migration Örneği
                                     <?php

Schema::create('media', function (Blueprint $table) {
$table->id();
$table->string('url');
$table->string('type'); // image, video, pdf vs.
$table->morphs('mediable'); // mediable_id ve mediable_type
$table->timestamps();
});
Kullanım Örneği
                                     <?php

$blog = Blog::find(1);
$post = Post::find(1);

// Blog’a Media ekleme
$blog->media()->create([
'url' => 'https://www.mehmetcanguler.com/uploads/blog-image.jpg',
'type' => 'image'
]);

// Post’a Media ekleme
$post->media()->create([
'url' => 'https://www.mehmetcanguler.com/uploads/post-video.mp4',
'type' => 'video'
]);

// Blog’un Medialarını çekme
$blogMedia = $blog->media;

// Post’un Medialarını çekme
$postMedia = $post->media;
📌 Yazı Bilgileri
  • Kod Temizliği: Polimorfik ilişkiler sayesinde aynı tabloyu kullanarak farklı modellerin medya öğelerini tek satırla yönetebilirsiniz.
  • Performans: Eloquent, gerekli join’leri arka planda yapar; sorgular optimize edilir ve veri tabanı yükü azaltılır.
  • Sadelik: armaşık SQL join’lerini manuel yazmaya gerek kalmaz, ORM üzerinden okunabilir ve sürdürülebilir bir yapı elde edilir.
  • Esneklik: Yeni bir model eklemek istediğinizde mevcut Media tablosunu kullanarak ilişkiyi hemen kurabilirsiniz.
🏷 Etiketler
Laravel Eloquent ORM Relationships MorphMany