Laravel İle E-Ticaret Siteleri İçin Dinamik Varyasyonlu Ürün Yönetimi Nasıl Yapılır?

Laravel İle E-Ticaret Siteleri İçin Dinamik Varyasyonlu Ürün Yönetimi Nasıl Yapılır?
Laravel İle E-Ticaret Siteleri İçin Dinamik Varyasyonlu Ürün Yönetimi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu rehberi uygulamak için sisteminizde Laravel 11 veya üzeri bir sürümün yüklü olması gerekmektedir. Veritabanı işlemleri için MySQL 8.0+ veya PostgreSQL kullanmanızı öneririz. Varyasyon yapısı için JSON sütun tiplerinden faydalanacağımızdan, modern veritabanı sürümleri JSON sorgulama performansında büyük avantaj sağlar.

  • Laravel 11+ Framework
  • PHP 8.3+
  • Composer paket yöneticisi
  • İlişkisel veritabanı yönetimi bilgisi

Veritabanı Şemasını Tasarlama

Varyasyon yönetimi için "Ürün (Product)" ve "Ürün Varyasyonu (ProductVariation)" şeklinde iki ana tabloya ihtiyacımız var. Varyasyonlar, ana ürüne bağlıdır ve kendi stok (SKU), fiyat ve özel özniteliklerine sahiptir.

// Migration dosyası: create_product_variations_table
Schema::create('product_variations', function (Blueprint $table) {
    $table->id();
    $table->foreignId('product_id')->constrained()->onDelete('cascade');
    $table->string('sku')->unique(); // Stok kodu
    $table->decimal('price', 10, 2);
    $table->integer('stock_quantity')->default(0);
    $table->json('attributes'); // Örn: {"renk": "kırmızı", "beden": "XL"}
    $table->timestamps();
});

Yukarıdaki kod bloğunda, attributes sütununu JSON tipinde tanımladık. Bu, her ürünün farklı varyasyon özelliklerine (bazı ürünlerde sadece renk, bazı ürünlerde hem renk hem beden) esnek bir şekilde sahip olmasını sağlar.

Eloquent İlişkilerini Kurma

Model katmanında, ürün ile varyasyonlar arasındaki ilişkiyi doğru tanımlamak, veri çekme işlemlerini kolaylaştırır. Product modeli içerisinde hasMany ilişkisini kurarak varyasyonlara kolayca erişebiliriz.

// Product.php Modeli
public function variations()
{
    return $this->hasMany(ProductVariation::class);
}

// ProductVariation.php Modeli
protected $casts = [
    'attributes' => 'array', // JSON verisini otomatik diziye çevirir
];

public function product()
{
    return $this->belongsTo(Product::class);
}

$casts özelliği, veritabanından gelen JSON verisini Laravel'in otomatik olarak bir PHP dizisine dönüştürmesini sağlar. Böylece $variation->attributes['renk'] şeklinde verilere kolayca erişebilirsiniz.

Dinamik Varyasyon Ekleme Mantığı

Yönetim panelinde varyasyonları oluştururken, kullanıcıdan gelen girdileri doğrulamak ve veritabanına güvenli bir şekilde kaydetmek kritik önem taşır. Form isteğini yönetirken FormRequest sınıfını kullanmak, kod temizliği açısından en iyi pratiktir.

// StoreVariationRequest.php
public function rules(): array
{
    return [
        'sku' => 'required|unique:product_variations,sku',
        'price' => 'required|numeric|min:0',
        'stock_quantity' => 'required|integer|min:0',
        'attributes' => 'required|array',
    ];
}

Bu doğrulama kuralları, veritabanına hatalı veya eksik veri girişini engeller. Özellikle sku alanının benzersiz olması, stok takibi için hayati önem taşır.

Varyasyonları Sorgulama ve Filtreleme

Kullanıcı bir ürün sayfasında "Kırmızı ve XL" seçeneğini seçtiğinde, ilgili varyasyonu veritabanından hızlıca bulmamız gerekir. JSON sütunları üzerinde sorgulama yapmak için Laravel'in whereJsonContains metodunu kullanırız.

// Controller içerisinde varyasyon arama
$variation = ProductVariation::where('product_id', $productId)
    ->whereJsonContains('attributes->renk', $request->renk)
    ->whereJsonContains('attributes->beden', $request->beden)
    ->firstOrFail();

Bu sorgu, belirli bir ürünün içindeki spesifik varyasyonu saniyeler içinde bulur. whereJsonContains metodu, JSON dizisi içindeki anahtar-değer eşleşmelerini optimize edilmiş şekilde arar.

Varyasyon Yönetimi Yöntem Karşılaştırması

Yöntem Avantajı Dezavantajı
JSON Sütunları Esnek yapı, şema değişikliği gerektirmez. Çok karmaşık sorgularda indeksleme zordur.
EAV (Entity-Attribute-Value) Sonsuz öznitelik ekleme imkanı. Sorgu performansı çok düşüktür.
İlişkisel (Pivot) Tablo Veri bütünlüğü çok yüksektir. Tablo sayısı hızla artar.
Güvenlik Uyarısı: Kullanıcıdan gelen verileri doğrudan veritabanına göndermeyin. Her zaman Laravel'in FormRequest validasyonlarını kullanın. JSON verilerini işlerken XSS saldırılarına karşı verileri çıktı alırken e() fonksiyonu ile escape etmeyi unutmayın.

Sıkça Sorulan Sorular

Varyasyonlar için ayrı bir tablo mu tutmalıyım?

Evet, stok takibi ve fiyatlandırma her varyasyon için farklı olacağından, her varyasyonu ayrı bir satır olarak tutmak en doğrusudur.

JSON sütunu çok büyürse ne olur?

JSON sütunu genellikle 5-10 öznitelik için idealdir. Eğer 100+ farklı öznitelik yönetecekseniz, ilişkisel bir yapıya geçiş yapmalısınız.

Stok düşme işlemini nasıl yapmalıyım?

Stok düşme işlemini mutlaka veritabanı transaction (işlem) blokları içerisinde DB::transaction() kullanarak yapmalısınız.

Arama motorları varyasyonları nasıl görür?

SEO uyumluluğu için her varyasyonun kendine ait bir URL'si olması gerekmez, ancak seçilen varyasyonun fiyatı gibi bilgileri JSON-LD (Schema.org) ile arama motorlarına bildirmelisiniz.

Performansı nasıl artırırım?

Sık kullanılan varyasyon sorguları için veritabanı indeksleri oluşturun ve Laravel Cache mekanizmasını kullanarak ürün detaylarını önbelleğe alın.

Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce mutlaka bir güvenlik testinden geçirin ve veritabanı yedeklerinizi düzenli alın.

Varyasyonlu Ürünler İçin Birim Testleri (Unit Testing)

Dinamik varyasyon yapısında en kritik nokta, stok düşme ve varyasyon seçimi sırasında oluşabilecek mantık hatalarıdır. Laravel'in Pest veya PHPUnit kütüphanesini kullanarak, varyasyonların doğru hesaplandığından emin olmalısınız. Aşağıdaki örnek, bir varyasyonun stok durumunu ve fiyat hesaplamasını test eden temel bir senaryodur.

public function test_product_variation_stock_decrement()
{
    $product = Product::factory()->create();
    $variation = $product->variations()->create([
        'sku' => 'TSHIRT-RED-L',
        'price' => 100,
        'stock' => 10
    ]);

    $this->postJson('/api/cart/add', [
        'product_id' => $product->id,
        'variation_id' => $variation->id,
        'quantity' => 2
    ]);

    $this->assertEquals(8, $variation->fresh()->stock);
}

Varyasyon Yönetiminde İleri İpuçları ve Optimizasyon

Büyük ölçekli e-ticaret sitelerinde, varyasyonların yönetimi sadece veritabanı ile sınırlı değildir. Kullanıcı deneyimini iyileştirmek için Eager Loading (istekli yükleme) stratejilerini doğru kullanmanız gerekir. Özellikle ürün listeleme sayfalarında, her ürün için ayrı ayrı varyasyon sorgusu yapmak yerine, ilişkileri tek bir sorguda çekin.

N+1 Sorununu Engelleme

Ürünleri listelerken varyasyonları dahil etmek, veritabanı sorgu sayısını ciddi oranda artırır. Bunu engellemek için with() metodunu kullanın:

// Controller içerisinde
$products = Product::with(['variations' => function($query) {
    $query->where('stock', '>', 0);
}])->paginate(20);

Özelleştirilmiş Varyasyon Filtreleme (Query Scopes)

Eloquent içerisinde Scope kullanarak, karmaşık filtreleme mantıklarını model seviyesine taşıyabilirsiniz. Bu, kodunuzun okunabilirliğini artırır ve tekrarı önler.

// Product model içerisinde
public function scopeWithAvailableVariations($query)
{
    return $query->whereHas('variations', function($q) {
        $q->where('stock', '>', 0);
    });
}

// Kullanımı
$availableProducts = Product::withAvailableVariations()->get();

Varyasyon Verisi İçin Önbellekleme Stratejisi

Varyasyonlar nadiren değişen ancak sürekli okunan verilerdir. Bu nedenle, ürün varyasyonlarını Redis veya Memcached üzerinde önbelleğe almak, veritabanı yükünü %80 oranında azaltabilir. Laravel'in remember yapısını kullanarak bu işlemi şu şekilde gerçekleştirebilirsiniz:

$variations = Cache::remember('product_variations_' . $productId, 3600, function () use ($productId) {
    return Variation::where('product_id', $productId)->get();
});

Bu yöntemle, veritabanına her istekte gitmek yerine, varyasyon verisi 1 saat boyunca bellekte tutulur. Ürün güncellendiğinde ise Cache::forget() metodu ile önbelleği temizlemeyi unutmamalısınız.

Sonuç

Laravel ile dinamik varyasyonlu ürün yönetimi, doğru veritabanı tasarımı ve Eloquent'in güçlü özellikleri ile oldukça yönetilebilir bir süreçtir. JSON sütunlarını kullanarak esnekliği korurken, ilişkisel veritabanı prensipleriyle veri bütünlüğünü sağladık. Bir sonraki adım olarak, bu yapıya "Sepet (Cart)" entegrasyonu ekleyerek, seçilen varyasyonun stok durumuna göre sepete ekleme mantığını geliştirebilirsiniz.

Bu yazıya tepkinizi paylaşın:
Kerem Tekin

Teknoloji ve yazılım kullanımı üzerine pratik kılavuzlar hazırlıyorum. Karmaşık dijital araçları, herkesin hızlıca öğrenebileceği sade rehberler haline getirmekte uzmanım.

Yorumlar (0)

Yorum Yaz