kadirakkus9 Tablo isimlendirmeleriniz çok karışık ve bazı yerler farklı olmuş. Aslında farklı bir cevap yazacaktım ama sildim. Ben size temel tabloları yazayım:
categories
Ürün kategorileri.
+----+-----------+-----+-----+-----------+
| id | parent_id | lft | rgt | name |
+----+-----------+-----+-----+-----------+
| 1 | | 1 | 6 | Erkek |
| 2 | 1 | 2 | 5 | Giyim |
| 3 | 2 | 3 | 4 | Üst Giyim |
+----+-----------+-----+-----+-----------+
Burada Nested Set veri yapısı kullanılıyor, forumda aratabilirsiniz. Örneğin bu tabloya göre Erkek kategorisinin içinde hangi kategoriler var derseniz (ve Erkek kategorisini de sonuca dahil ederseniz)
SELECT *
FROM categories
WHERE lft >= 1
AND rgt <= 6
ORDER BY lft
şeklinde sorgu atılır. Bu sorgu size şunu döner:
1 Erkek
2 Giyim
3 Üst Giyim
ve mesela şunu yapmanıza olanak tanır:
Erkek > Giyim > Üst Giyim
Bu yapıyı Laravel'de kolayca kullanmak için şu paketi kullanıyorum:
https://github.com/lazychaser/laravel-nestedset
Yapıyı resimle anlatmak gerekirse (lft ve rgt nedir mesela):
products
Ana ürünler
+----+---------+
| id | name |
+----+---------+
| 1 | T-Shirt |
+----+---------+
product_categories (pivot)
Hangi ürün hangi kategoride
+------------+-------------+
| product_id | category_id |
+------------+-------------+
| 1 | 3 |
+------------+-------------+
attributes
Ürün özellikleri
+----+-------+
| id | name |
+----+-------+
| 1 | Beden |
| 2 | Renk |
+----+-------+
attribute_values
Özellik değerleri
+----+--------------+---------+------+
| id | attribute_id | name | code |
+----+--------------+---------+------+
| 1 | 1 | S | S |
| 2 | 1 | M | M |
| 3 | 2 | Kırmızı | KRM |
| 4 | 2 | Mavi | MVI |
+----+--------------+---------+------+
product_attributes (pivot)
Hangi ürün hangi özelliğin hangi değerine sahip. Bu tabloya göre T-shirt, S beden ve kırmızı renge sahip
+------------+--------------+----------+
| product_id | attribute_id | value_id |
+------------+--------------+----------+
| 1 | 1 | 1 |
| 1 | 2 | 3 |
+------------+--------------+----------+
variants
Ürünler/Varyantlar/Varyasyonlar...
+----+------------+-------------+-------------------------+
| id | product_id | sku | name |
+----+------------+-------------+-------------------------+
| 1 | 1 | 1-S-KRM | Kırmızı S Beden T-Shirt |
+----+------------+-------------+-------------------------+
shops
Dükkanlar/Şubeler. Neden böyle bir tablo var derseniz sebebi product_stock tablosunda yazıyor:
+----+-----------------+
| id | name |
+----+-----------------+
| 1 | Kadıköy Şube |
| 2 | Beylikdüzü Şube |
+----+-----------------+
product_stock (pivot)
Ürün stokları tablosu. Birden fazla şube vs olabileceği için her ürün her mağazada farklı stokta ve nadiren de olsa farklı fiyatta yer alabilir. O yüzden ayrı tabloda tutulması mantıklı (Tabloya göre Beylikdüzü mağazasında Kırmızı S beden t-shirt stokta kalmamış)
+---------+------------+------------+----------+-------+
| shop_id | product_id | variant_id | quantity | price |
+---------+------------+------------+----------+-------+
| 1 | 1 | 1 | 17 | 29.95 |
| 2 | 1 | 1 | 0 | 29.95 |
+---------+------------+------------+----------+-------+
Senaryo:
- Kullanıcı ürün detay sayfasına geldi. product_id=1 yani hangi ürün olduğunu biliyoruz.
- Hangi ürün olduğunu bildiğimiz için product_attributes tablosundan product_id=1 olan özellikleri alıp ekrana gösterdik. Detay sayfasında şimdi sırasıyla Beden ve Renk gösteriyoruz.
- Bu beden ve renk altında attribute_values tablosunda yer alan değerleri gösteriyoruz ama bunu yaparken sadece product_attributes içinde yer alan value_id'lerine göre listeletiyoruz. Yani beden altında S; renk altında ise sadece Kırmızı listelendi.
- Kullanıcı S seçti, Kırmızı seçti. S'nin kodu S, Kırmızının kodu KRM, product_id ise 1. Şu an aslında SKU kodunu tekrar oluşturmam için tüm veri var. Hepsini - ile, sırasını bozmadan birleştirince 1-S-KRM elde ettim.
- Elde ettiğim bu 1-S-KRM kodu ile variants tablosuna where sku = '1-S-KRM' şeklinde sorgu atarak seçilen özelliklere denk gelen varyantı buldum.
- Sepete ekledim.
Bu varyant elde etmenin başka yolları da var. Herkes kendi sistemine, tablo yapısına göre kodluyor. Sizin VaryasyonSecenekID olayı mantıklı, kullanabilirsiniz. Örneğin şöyle bir pivot tablo da tutulabilir:
variant_attribute_values
+------------+----------+
| variant_id | value_id |
+------------+----------+
| 1 | 1 |
| 1 | 3 |
+------------+----------+
ya da product_attributes tablosuna variant_id eklenebilir.
SKU kodu otomatik oluşan bir kod olmalı ve tersten tekrar oluşturulabilmeli. Bu kod müşterinin gireceği bir kod değil. Varsa öyle bir kod, barkod gibi, onu ayrı bir alanda tutmalısınız.