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_sector
playlist_radio
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 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ı
Migration Oluştur
create_muzibu_playlist_corporate_table.php
- playlist_sector ile birebir aynı yapı
Hem migrations/ hem tenant/ altına koy!
Playlist Model'e corporates() Ekle
sectors() ve radios() ile aynı pattern - tek method
Corporate Model'e playlists() Ekle
Ters ilişki - kurumun playlistlerine erişim
Admin UI: Playlist Manage'e Corporate Selector
Mevcut Sector/Radio selector pattern'ini kopyala
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
"Sector ve Radio zaten çalışıyor. Corporate da aynı şekilde çalışsın."