Neden Değişti?
v1 - Karmaşık Yaklaşım
-
Yeni pivot tablo:
corporate_playlists -
3 yeni kolon:
is_corporate,owner_corporate_id,visibility - Yeni Service class gerekli
- Ekstra JOIN, performans yükü
Over-engineering: İhtiyaç olmayan özellikler için karmaşıklık
v2 - Basit Yaklaşım
-
Yeni tablo yok, mevcut
playlistskullan -
Sadece 1 kolon:
corporate_id - Mevcut Playlist model'e birkaç method
- Basit WHERE, hızlı query
KISS Prensibi: Keep It Simple, Stupid
Tek Kolon Çözümü
muzibu_playlists tablosu
| Kolon | Tip | Durum | Açıklama |
|---|---|---|---|
| playlist_id | bigint PK | Mevcut | Primary key |
| user_id | bigint FK | Mevcut | Oluşturan kullanıcı |
| corporate_id | bigint FK nullable | YENİ | Hangi kuruma ait? (NULL = normal playlist) |
| title | json | Mevcut | Çoklu dil başlık |
| is_system | boolean | Mevcut | Sistem playlisti mi? |
| is_public | boolean | Mevcut | Herkese açık mı? |
| ... | ... | Mevcut | Diğer alanlar aynı kalır |
🏢
Kurumsal Playlist
corporate_id = 5
Kurum #5'e ait playlist
👤
Kullanıcı Playlisti
corporate_id = NULL
Normal kullanıcı playlisti
⚙️
Sistem Playlisti
corporate_id = NULL + is_system = 1
Admin oluşturduğu genel liste
Migration
add_corporate_id_to_muzibu_playlists_table.php
database/migrations/tenant/public function up(): void
{
Schema::table('muzibu_playlists', function (Blueprint $table) {
// Kurumsal playlist için foreign key
$table->unsignedBigInteger('corporate_id')
->nullable()
->after('user_id');
// Foreign key constraint
$table->foreign('corporate_id')
->references('id')
->on('muzibu_corporate_accounts')
->onDelete('cascade');
// Hızlı sorgu için index
$table->index('corporate_id');
});
}
public function down(): void
{
Schema::table('muzibu_playlists', function (Blueprint $table) {
$table->dropForeign(['corporate_id']);
$table->dropIndex(['corporate_id']);
$table->dropColumn('corporate_id');
});
}
Hatırlatma: Hem
database/migrations/tenant/ hem de database/migrations/ klasörüne koy!
Model Güncellemeleri
Playlist.php
// Fillable'a ekle
protected $fillable = [
// ... mevcut alanlar ...
'corporate_id', // YENİ
];
/**
* Playlist'in ait olduğu kurum
*/
public function corporate(): BelongsTo
{
return $this->belongsTo(
MuzibuCorporateAccount::class,
'corporate_id'
);
}
/**
* Kurumsal playlist mi?
*/
public function isCorporate(): bool
{
return $this->corporate_id !== null;
}
/**
* Scope: Kurumsal playlistler
*/
public function scopeCorporate($query)
{
return $query->whereNotNull('corporate_id');
}
/**
* Scope: Belirli kurumun playlistleri
*/
public function scopeForCorporate($query, $id)
{
return $query->where('corporate_id', $id);
}
MuzibuCorporateAccount.php
/**
* Kurumun playlistleri
*/
public function playlists(): HasMany
{
return $this->hasMany(
Playlist::class,
'corporate_id'
);
}
/**
* Aktif playlistler
*/
public function activePlaylists(): HasMany
{
return $this->playlists()
->where('is_active', true);
}
/**
* Playlist sayısı
*/
public function getPlaylistsCountAttribute(): int
{
return $this->playlists()->count();
}
Query Örnekleri
Kurumun playlistlerini getir
Playlist::forCorporate($corporateId)->active()->get();
Üyenin erişebildiği kurumsal playlistler
$corporate = MuzibuCorporateAccount::getCorporateForUser($userId);
Playlist::forCorporate($corporate->id)->active()->get();
Playlist sayfası: Tümü + Kurum filtresi
$query = Playlist::active()->public();
if ($request->corporate) {
$query->forCorporate($request->corporate);
}
return $query->paginate(20);
Public kurumları listele (filter dropdown için)
MuzibuCorporateAccount::whereNull('parent_id')
->where('is_active', true)
->whereHas('playlists', fn($q) => $q->active()->public())
->get();
Uygulama Akışı
1
Migration Oluştur & Çalıştır
Tek kolon ekleme: corporate_id
php artisan make:migration add_corporate_id_to_muzibu_playlists_table
2
Model Relations Ekle
Playlist → corporate(), Corporate → playlists()
3
Corporate Dashboard: Playlist Tab
Firma sahibinin playlist oluşturma/düzenleme arayüzü
- • corporate/dashboard.blade.php → Yeni tab ekle
- • Playlist CRUD (mevcut admin pattern kullan)
4
Playlist Sayfası: Kurum Filtresi
Sektör/Radyo gibi "Kurumlar" filter tab
- • playlists/index.blade.php → Filter tabs
- • Kurum dropdown component
5
Üye Görünümü
My Corporate sayfasında kurumsal playlistler section
Değişecek Dosyalar
Yeni Dosyalar
- migrations/tenant/add_corporate_id_to_playlists.php
- migrations/add_corporate_id_to_playlists.php
Güncellenecek Dosyalar
- Modules/Muzibu/app/Models/Playlist.php
- Modules/Muzibu/app/Models/MuzibuCorporateAccount.php
- Controllers/Front/PlaylistController.php
- Controllers/Front/CorporateFrontController.php
- views/themes/muzibu/playlists/index.blade.php
- views/themes/muzibu/corporate/dashboard.blade.php
Bu Yaklaşımın Avantajları
⚡
Hızlı
Tek WHERE, ekstra JOIN yok
🧩
Basit
Anlaşılır, bakımı kolay
🔧
Mevcut Pattern
Playlist model'i zaten var
📈
Genişletilebilir
İleride pivot gerekirse ekleriz