Final Çözüm v4 Mevcut Pattern

Mevcut Pattern'i Kullan

Yeni tablo yapısı yok, mevcut playlist_* pattern'ini genişlet

30 Aralık 2025 En Akıllı Çözüm

Neden v4 En İyisi?

v1, v2, v3'ün Sorunu

  • v1: Yeni pivot tablo + 3 kolon = over-engineering
  • v2: Tek kolon = çoklu kurum paylaşımı desteklemez
  • v3: Sadece karşılaştırma, çözüm değil

v4'ün Avantajı

  • Mevcut pattern'i kullan (test edilmiş!)
  • Çoklu kurum paylaşımı destekler
  • Sıfır kod değişikliği riski
  • Mevcut admin UI pattern'i kullanılabilir

Mevcut Sistem Analizi

Zaten Var Olan Pivot Tabloları

playlist_song

playlist_id FK
song_id FK
position
timestamps
Many-to-Many + Pivot data

playlist_sector

playlist_id FK
sector_id FK
-
-
Simple Many-to-Many

playlist_radio

playlist_id FK
radio_id FK
-
-
Simple Many-to-Many

Aynı Pattern'i Corporate İçin Kullanalım!

muzibu_playlist_corporate tablosu oluşturalım. Sector ve Radio ile birebir aynı yapı. Zaten çalışıyor, test edilmiş, güvenilir.

Mevcut Playlist Model İlişkileri

// Playlist.php - Mevcut ilişkiler (324-349. satırlar)

/**
 * Sektörler ilişkisi (many-to-many)
 */
public function sectors()
{
    return $this->belongsToMany(
        Sector::class,
        'muzibu_playlist_sector',
        'playlist_id',
        'sector_id',
        'playlist_id',
        'sector_id'
    );
}

/**
 * Radyolar ilişkisi (many-to-many)
 */
public function radios()
{
    return $this->belongsToMany(
        Radio::class,
        'muzibu_playlist_radio',
        'playlist_id',
        'radio_id',
        'playlist_id',
        'radio_id'
    );
}

v4 Çözümü: playlist_corporate

Migration (Sector ile Birebir Aynı)

// create_muzibu_playlist_corporate_table.php

Schema::create('muzibu_playlist_corporate', function (Blueprint $table) {
    $table->foreignId('playlist_id')
          ->constrained('muzibu_playlists', 'playlist_id')
          ->cascadeOnDelete();

    $table->foreignId('corporate_id')
          ->constrained('muzibu_corporate_accounts')
          ->cascadeOnDelete();

    // Primary key (aynı pattern)
    $table->primary(['playlist_id', 'corporate_id']);

    // Index (aynı pattern)
    $table->index('corporate_id');
});
playlist_sector ile birebir aynı yapı!

Playlist Model'e Eklenecek

/**
 * Kurumlar ilişkisi (many-to-many)
 * Sector/Radio ile aynı pattern
 */
public function corporates()
{
    return $this->belongsToMany(
        MuzibuCorporateAccount::class,
        'muzibu_playlist_corporate',
        'playlist_id',
        'corporate_id',
        'playlist_id',
        'id'
    );
}

/**
 * Scope: Belirli kurumun playlistleri
 */
public function scopeForCorporate($query, $corporateId)
{
    return $query->whereHas('corporates', fn($q) =>
        $q->where('corporate_id', $corporateId)
    );
}

Corporate Model'e Eklenecek

// MuzibuCorporateAccount.php

/**
 * Kurumun playlistleri (many-to-many)
 */
public function playlists(): BelongsToMany
{
    return $this->belongsToMany(
        Playlist::class,
        'muzibu_playlist_corporate',
        'corporate_id',
        'playlist_id',
        'id',
        'playlist_id'
    );
}

/**
 * Aktif playlistler
 */
public function activePlaylists(): BelongsToMany
{
    return $this->playlists()->where('is_active', true);
}

Pattern Karşılaştırması

MEVCUT YAPI:

┌─────────────────┐       ┌──────────────────────┐       ┌─────────────────┐
│    Playlist     │       │  playlist_sector     │       │     Sector      │
├─────────────────┤       ├──────────────────────┤       ├─────────────────┤
│ playlist_id  ◄──┼───────┤ playlist_id          │       │ sector_id    ◄──┼──┐
│ title           │       │ sector_id ───────────┼───────┤ name            │  │
│ ...             │       └──────────────────────┘       └─────────────────┘  │
└─────────────────┘                                                           │
        │                 ┌──────────────────────┐       ┌─────────────────┐  │
        │                 │  playlist_radio      │       │     Radio       │  │
        └─────────────────┤ playlist_id          │       ├─────────────────┤  │
                          │ radio_id ────────────┼───────┤ radio_id     ◄──┼──┤
                          └──────────────────────┘       └─────────────────┘  │
                                                                              │
YENİ EKLENECEK (Aynı Pattern):                                                │
                                                                              │
                          ┌──────────────────────┐       ┌─────────────────┐  │
                          │  playlist_corporate  │       │   Corporate     │  │
        ┌─────────────────┤ playlist_id          │       ├─────────────────┤  │
        │                 │ corporate_id ────────┼───────┤ id           ◄──┼──┘
        │                 └──────────────────────┘       │ company_name    │
        │                                                │ ...             │
        ▼                                                └─────────────────┘
┌─────────────────┐
│    Playlist     │  ← Tek ek: corporates() relation
└─────────────────┘

Kullanım Örnekleri

Playlist'i Kuruma Ekle

$playlist->corporates()->attach($corporateId);

Sector/Radio ile aynı syntax!

Birden Fazla Kuruma Ata

$playlist->corporates()->sync([1, 5, 12]);

3 farklı kuruma aynı anda!

Kurumun Playlistleri

$corporate->playlists()->active()->get();

Kuruma atanmış tüm playlistler

Playlist Sayfası Filtre

Playlist::forCorporate($id)->active()->get();

URL: /playlists?corporate=5

Üyenin Erişebildiği Playlistler

$userCorporate = MuzibuCorporateAccount::getCorporateForUser($userId);
$playlists = $userCorporate->activePlaylists;

Üyenin kurumuna ait playlistler

Kurumdan Çıkar

$playlist->corporates()->detach($corporateId);

Tek kurumdan çıkar, diğerleri kalır

Tüm Versiyonların Karşılaştırması

Kriter v1 v2 v4
Çoklu kurum paylaşımı
Mevcut pattern uyumu
Yeni kolon playlists tablosuna 3 kolon 1 kolon 0 kolon
Yeni tablo Karmaşık pivot Yok Basit pivot (mevcut gibi)
Admin UI pattern Yeni tasarım Yeni tasarım Sector/Radio gibi
attach/detach/sync Özel logic Yok Laravel native
Test edilmiş pattern

Uygulama Adımları

1

Migration Oluştur

create_muzibu_playlist_corporate_table.php - playlist_sector ile birebir aynı yapı

Hem migrations/ hem tenant/ altına koy!

2

Playlist Model'e corporates() Ekle

sectors() ve radios() ile aynı pattern - tek method

3

Corporate Model'e playlists() Ekle

Ters ilişki - kurumun playlistlerine erişim

4

Admin UI: Playlist Manage'e Corporate Selector

Mevcut Sector/Radio selector pattern'ini kopyala

5

Frontend: Playlist Sayfası Kurum Filtresi

?corporate=X query parametresi + dropdown

🎯

v4: Doğru Çözüm

Mevcut pattern'i genişlet, tekerleği yeniden icat etme

%100
Pattern Uyumu
0
Yeni Kolon (playlists)
~30 satır
Toplam Kod Değişikliği

"Sector ve Radio zaten çalışıyor. Corporate da aynı şekilde çalışsın."