🔴 SORUN: Duplicate Fotoğraf Yükleme

Blog AI sistemi her görsel için 2 media record oluşturuyor!

📅 16 Kasım 2025 | 🔍 Analiz Eden: Claude Code

❌ Sorun Nedir?

DUPLICATE MEDIA RECORD OLUŞUYOR!

Blog AI sistemi her görsel için 2 kere media kaydı oluşturuyor:

  • 1. MediaLibraryItem → 'library' collection
  • 2. Blog Media → 'featured' collection

📊 Duplicate İstatistikleri:

2x
Media Record
2x
Database Kayıt
%100
Duplicate Oranı

🔍 Sorun Nasıl Oluşuyor?

1. AIImageGenerationService::generate()
DALL-E 3 ile görsel üretir
2. MediaLibraryItem Oluşturulur
Database'e kaydedilir
3. addMediaFromUrl() → 'library' collection
✅ İLK MEDIA RECORD
4. BlogAIContentWriter $media alır
$media = $mediaItem->getFirstMedia('library')
5. AYNI GÖRSELİ TEKRAR EKLER!
❌ İKİNCİ MEDIA RECORD (DUPLICATE!)
$blog->addMedia($media->getPath())->toMediaCollection('featured')

💻 Sorunlu Kod (BlogAIContentWriter.php)

Satır 88-140: Featured Image Üretimi

// Satır 90-103: AI görsel üret $mediaItem = $imageService->generate( $imagePrompt, [ 'size' => '1792x1024', 'quality' => 'hd' ] ); // ✅ İLK MEDIA RECORD: MediaLibraryItem oluşturuldu // addMediaFromUrl() ile 'library' collection'a eklendi // Satır 104: Media'yı al $media = $mediaItem->getFirstMedia('library'); // Satır 114-125: SORUN BURASI! $blog->addMedia($media->getPath()) // ❌ AYNI GÖRSELİ TEKRAR EKLE! ->preservingOriginal() ->withCustomProperties([ 'alt_text' => ['tr' => $blogTitle], 'title' => ['tr' => $blogTitle . ' - Blog Görseli'], ... ]) ->toMediaCollection('featured'); // ❌ İKİNCİ MEDIA RECORD!

📋 Detaylı Akış:

1️⃣ AIImageGenerationService::generate() (Satır 36-40)

public function generate(string $prompt, array $options = []): MediaLibraryItem { $result = $this->generateWithRevision($prompt, $options); return $result['mediaItem']; // MediaLibraryItem döner }

2️⃣ generateWithRevision() (Satır 50-93)

// Satır 66: MediaItem oluştur $mediaItem = $this->createMediaItem($imageData, $prompt, $options); // ✅ İLK MEDIA RECORD BURADA OLUŞUYOR!

3️⃣ createMediaItem() (Satır 195-216)

protected function createMediaItem(array $imageData, string $prompt, array $options): MediaLibraryItem { // Database'e MediaLibraryItem kaydet $mediaItem = MediaLibraryItem::create([ 'name' => 'AI Generated - ' . substr($prompt, 0, 50), 'type' => 'image', ... ]); // Görseli 'library' collection'a ekle $mediaItem->addMediaFromUrl($imageData['url']) ->toMediaCollection('library'); // ✅ İLK MEDIA! return $mediaItem; }

4️⃣ BlogAIContentWriter TEKRAR EKLER (Satır 114-125)

// MediaItem'dan media'yı al $media = $mediaItem->getFirstMedia('library'); // İlk media record // AYNI GÖRSELİ Blog'a TEKRAR ekle $blog->addMedia($media->getPath()) // ❌ DUPLICATE! ->preservingOriginal() ->toMediaCollection('featured'); // ❌ İKİNCİ MEDIA!

✅ ÇÖZÜM YOLLARI

ÇÖZÜM 1: MediaLibraryItem Kullan (ÖNERİLEN)

Blog'a tekrar addMedia() yapmak yerine, direkt MediaLibraryItem'ı kullan!

// Satır 88-103: Görsel üret (aynı kalsın) $mediaItem = $imageService->generate($imagePrompt, [ 'size' => '1792x1024', 'quality' => 'hd' ]); // Satır 104: Media'yı al $media = $mediaItem->getFirstMedia('library'); // Satır 106-113: SEO meta ekle (MediaLibraryItem'a) if ($media) { $media->setCustomProperty('alt_text', ['tr' => $blogTitle]); $media->setCustomProperty('title', ['tr' => $blogTitle . ' - Ana Görsel']); $media->setCustomProperty('description', ['tr' => $blogData['excerpt']]); $media->setCustomProperty('width', 1792); $media->setCustomProperty('height', 1024); $media->setCustomProperty('seo_optimized', true); $media->save(); // ✅ ÇÖZÜM: Blog ile MediaLibraryItem'ı ilişkilendir // Yeni media record oluşturma, sadece relation ekle! $blog->media_library_id = $mediaItem->id; // Foreign key $blog->save(); // VEYA polymorphic relation kullan: // $blog->mediaLibraryItems()->attach($mediaItem->id); }
ÇÖZÜM 2: addMedia() Kaldır

Blog'a addMedia() yapma, sadece MediaLibraryItem'ı referans et!

// ❌ BUNU KALDIR: $blog->addMedia($media->getPath()) ->preservingOriginal() ->toMediaCollection('featured'); // ✅ BUNU EKLE: $blog->featured_image_id = $mediaItem->id; // Foreign key $blog->save();
ÇÖZÜM 3: Move Media (Taşı)

Media'yı 'library'den 'featured'a taşı (duplicate oluşturmadan)

$media = $mediaItem->getFirstMedia('library'); if ($media) { // SEO meta ekle $media->setCustomProperty('alt_text', ['tr' => $blogTitle]); $media->setCustomProperty('seo_optimized', true); ... $media->save(); // ✅ Media'yı 'featured' collection'a TAŞI (duplicate YOK!) $media->move($blog, 'featured'); // Library'den featured'a taşı }

🎯 Önerilen Çözüm Özeti

En Temiz Çözüm: Blog modelinde featured_image_id foreign key kullan. Böylece:

✅ Sonuç:

1x
Media Record
0%
Duplicate
%50
Disk Tasarrufu