Basitleştirilmiş v2

Kurumsal Playlist - Tek Kolon Yaklaşımı

Pivot tablo yok, karmaşıklık yok, sadece corporate_id

30 Aralık 2025 Revize: v1 → v2

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 playlists kullan
  • 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