Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?
Merhabalar kolay gelsin arkadaşlar, daha önce mgsmus üstadım formda bir yerde bahsetmişti ama bulamadım o yüzden tekrar soruyorum kusura bakmayın, e ticaret mantığında bir site tasarlıyorum, ürün ve datay kısımlarını ayrı tablolarda tutmak istiyorum fakat takıldığım bir nokta var, mesela kategorinin birisinde tshirt var burada ürün detay kısmında renk var beden var dar kesim gibi opsiyonlar var, başka bir kategoride ise küçük hediyelik eşyalar gurubu var, ürün detay kısmında ise ebatlar var, renk var, yani kategoriye göre ürün detay kısımları değişiyor bunun veritabanı ilişkisini daha kullanışlı olması açısından sizce nasıl oluşturmalıyım.
mgsmus yazdıŞurada kısaca bahsetmiştim:
https://laravel.gen.tr/d/2771

Genel olarak buna SKU (Stok Keeping Unit) deniyor. Uzun bir konu olduğu için kendiniz önce araştırmanız gerekiyor.
Ben inceledim ve tam da olması gerektiği gibi anlatmışsın üstad. Yalnız e-ticaret sisteminde önemli olan, ürün özelliklerinin müşteri tarafından dinamik olarak belirlenmesi ve bunun filtreleme de kullanılması. Bunun için nasıl bi çözüm buldunuz Her müşteri ve sektöre göre özel mi çalışıyorsunuz yoksa dinamik bir altyapınız mı var ?
Category - Ürün kategorileri
Product - Ürünler
ProductOption - Ürün seçenekleri. Ör: Renk, Boyut, Beden vs
ProductOptionValue - Ürün seçenek değerleri. Örneğin beden seçeneği için XS, S, M, L, XL, XXL
ProductAttribute - Ürün özellikleri. Ör: Kumaş tipi (Genellikle fiyatı etkilemez)
ProductAttributeValue - Ürün özellikleri değerleri. Ör: Kumaş tipi için Pamuklu, Yünlü, Elyaf (Genellikle fiyatı etkilemez)
ProductVariant - Ürün varyantları. Örneğin L beden kırmızı renk pamuklu t-shirt
Pivots\ProductCategory - Hangi ürün hangi kategorilerde yer alıyor, bunu tutan pivot
Pivots\ProductOption - Hangi ürün hangi seçeneklere sahip, bunu tutan pivot
Pivots\ProductAttribute - Hangi ürün hangi özelliklere sahip, bunu tutan pivot

Bu şekilde bir yapı ile basit anlamda dinamik bir şekilde seçenek ve özellik girişi yapılabilir, varyantlar oluşturulabilir.

Filtreleme için ise, örneğin özelliklere göre, Product modelini Pivots\ProductAttribute üzerinden (JOIN) ProductAttributeValue ile birleştirip (JOIN) filtreleme yapılabilir.

Bazen ayrı bir tabloda product_id, attribute_id, attribute_value_id, option_id, option_value_id şeklinde karma bir veri de tutulur. Filtreleme gibi bazı işlemlerin kolay yapılmasını sağlar.

Teorik olarak konuşulması zor bir konu. Bir yerden başlamanız lazım ki elinizde sonuçlar oluşabilsin.
    mgsmus yazdıCategory - Ürün kategorileri
    Product - Ürünler
    ProductOption - Ürün seçenekleri. Ör: Renk, Boyut, Beden vs
    ProductOptionValue - Ürün seçenek değerleri. Örneğin beden seçeneği için XS, S, M, L, XL, XXL
    ProductAttribute - Ürün özellikleri. Ör: Kumaş tipi (Genellikle fiyatı etkilemez)
    ProductAttributeValue - Ürün özellikleri değerleri. Ör: Kumaş tipi için Pamuklu, Yünlü, Elyaf (Genellikle fiyatı etkilemez)
    ProductVariant - Ürün varyantları. Örneğin L beden kırmızı renk pamuklu t-shirt
    Pivots\ProductCategory - Hangi ürün hangi kategorilerde yer alıyor, bunu tutan pivot
    Pivots\ProductOption - Hangi ürün hangi seçeneklere sahip, bunu tutan pivot
    Pivots\ProductAttribute - Hangi ürün hangi özelliklere sahip, bunu tutan pivot

    Bu şekilde bir yapı ile basit anlamda dinamik bir şekilde seçenek ve özellik girişi yapılabilir, varyantlar oluşturulabilir.

    Filtreleme için ise, örneğin özelliklere göre, Product modelini Pivots\ProductAttribute üzerinden (JOIN) ProductAttributeValue ile birleştirip (JOIN) filtreleme yapılabilir.

    Bazen ayrı bir tabloda product_id, attribute_id, attribute_value_id, option_id, option_value_id şeklinde karma bir veri de tutulur. Filtreleme gibi bazı işlemlerin kolay yapılmasını sağlar.

    Teorik olarak konuşulması zor bir konu. Bir yerden başlamanız lazım ki elinizde sonuçlar oluşabilsin.
    Fikir vermesi açısından güzel bir yol haritası kendi adıma teşekkür ediyorum.
    Üstad çok teşekkür ederim. eline sağlık, aslında bu tür konularda görsel bir video hazırlasan da bizlerde satın alsak, yani laraveli en baştan anlatan videolar olmasına gerek yok, zaten piyasada oldukça var, önemli olan bu tür detay kısımların anlatıldığı ileri laravel videoları, örneğin sınırsız kategorileme ve görsel kısmı, socket.io redis, notification, pusher, rest-api gibi 10-15 başlığa değinsen harika olur. udemy üzerinden oluşturabilirsin bizlerde oradan satın alma yaparız,Laravel Türkiye ailesi olarak çok faydalı bir şey olur, bu sayede bizlerde yavaş yavaş senin yükünü alırız formda bir kaç soru cevaplayacak noktaya geliriz sayende, bir düşün derim :)) fikrime katılan arkadaşlar bu mesaja desteğinizi bekliyorum..
    oo çok ustalık gerektirecek bir kurgu bu.İleriye dönük komplex düşünmeniz lazım.İşin esasında varyasyon oluşturulacak bir kombine sistemdir bu.
    Ornegin :

    bir ürün var ve bu urunun varyasyonlarını belirlemeniz gerekir.Ve bu varyasyonlar ileriye donuk macroable olması lazım yani genişletilebilir tarzda olması gerekir.@mgsmus konuyu cok iyi yazmıs aslında verdiği linke bakarsanız..Yani urunun en once varyasyonlarını belirlemen lazım bunu da kombine edip kombinasyonlarını baska bir tabloda tutmanız gerekir.
    
    $product= 'Iphone x';
     $variations = array(
     'color' => array('black', 'white'),
     'memory' => array('16GB', '32GB', '64GB')
     );
    
    
    varyasyonları
    
    array(
    0 => 'iphone x - black, 16GB',
    1 => 'iphone x - black, 32GB',
    2 => 'iphone x - black, 64GB',
    3 => 'iphone x - white, 16GB',
    4 => 'iphone x - white, 32GB',
    5 => 'iphone x - white, 64GB',
    );
    
    

    bu varyasyonları baska bir tablo stock satılabilir mi satılamaz mı fiyatı kac para,kampanyası var mı yok mu. stockta olsa bile satışa acık mı kapalı mı gibi geniş caplı bir field olusturup projenizi buna göre adapte etmeniz gerekecektir.

    En onemli husus bu varyasyonlar 1.ci yazdıgım array ile macroable olmalı.yani 1.ci yazılan genişletildiğinde otomatik kombinasyon calıstırılıp varyasyon tablosu güncellenmeli..

    zaten @mgmus hepsini anlatmıs.
    Burada önemli noktalardan biri SKU kodunun oluşturulması ve kullanılması. Ürünü satın alırken ürün seçeneklerini seçtiğiniz detay sayfasında örneğin 2 tane select düşünün. İlki beden, ikincisi renk olsun. Önce bedeni seçiyorsunuz, diyelim ki L, ona göre altta renkler yükleniyor. Burada bir stok kontrolü yapılması lazım, SKU kodunu oluşturan seçenekler içerisinde L bedene sahip ürünlerden hangilerinin farklı renklerde stoğu var şeklinde. Mavi, beyaz var ama kırmızı bitmiş, o yüzden o seçilemiyor. Daha sonra maviyi seçiyorsunuz diyelim. Ürün id'si 11 (PRD00011), beden L'nin id'si 2 (L) ve Mavi rengin id'si 3 (MAVI) olsun. PRD00011-L-MAVI şeklinde bir SKU kodu oluştu. Bu durumda ürün id ve bu iki farklı seçeneğin id'sini verdiğinizde size PRD00011-L-MAVI kodunu getirecek bir tablo lazım. Bu koddan da satın alınmak istenen varyanta ulaşacaksınız. Bu oluşan SKU sizin varyantın tablosunda zaten var, varyant oluştururken oluşturdunuz, seçeneklerden bu koda her türlü ulaşabilmeniz lazım ki varyantı seçebilesiniz.

    Bu benim düşündüğüm sistem. Daha kolay yolunu bilen varsa yazabilir.
    Peki @deathisonitsway macrolardan bahsetmiş. Bu kadar sağlam bir OOP bilgisine sahip olmak gerekiyor mu böyle bir ürün tabloları yaklaşımı için ?
    mgsmus yazdıBurada önemli noktalardan biri SKU kodunun oluşturulması ve kullanılması. Ürünü satın alırken ürün seçeneklerini seçtiğiniz detay sayfasında örneğin 2 tane select düşünün. İlki beden, ikincisi renk olsun. Önce bedeni seçiyorsunuz, diyelim ki L, ona göre altta renkler yükleniyor. Burada bir stok kontrolü yapılması lazım, SKU kodunu oluşturan seçenekler içerisinde L bedene sahip ürünlerden hangilerinin farklı renklerde stoğu var şeklinde. Mavi, beyaz var ama kırmızı bitmiş, o yüzden o seçilemiyor. Daha sonra maviyi seçiyorsunuz diyelim. Ürün id'si 11 (PRD00011), beden L'nin id'si 2 (L) ve Mavi rengin id'si 3 (MAVI) olsun. PRD00011-L-MAVI şeklinde bir SKU kodu oluştu. Bu durumda ürün id ve bu iki farklı seçeneğin id'sini verdiğinizde size PRD00011-L-MAVI kodunu getirecek bir tablo lazım. Bu koddan da satın alınmak istenen varyanta ulaşacaksınız. Bu oluşan SKU sizin varyantın tablosunda zaten var, varyant oluştururken oluşturdunuz, seçeneklerden bu koda her türlü ulaşabilmeniz lazım ki varyantı seçebilesiniz.

    Bu benim düşündüğüm sistem. Daha kolay yolunu bilen varsa yazabilir.
    Üstad video çekim işine ne dedin ? ilk video çekim işine bu konudan giriş yapabiliriz mesela , Başlık "Ürün ve varyant tanımlama" Müsaitlik durumunuzu bilmiyorum ama sen veya forumda iyi olan bir kaç arkadaş beraberde organize edebilirsiniz veya katkı sağlamak isteyenler çıkabilir şahsen ilk satın alma işlemini ben yapayım katkım olması için, bizim bu tür şeylere ihtiyacımız var, kaynakların bir çoğu yabancı aslında ürün kategori ve varyant belirleme işleminin bize bir videosunu çekip Laravel Türkiye formuna bir iyilik daha yapsan on numara iş olur
    @GkyKrkc

    Siz daha önce de böyle bir şeyler söylemiştiniz ama ne yapma isteğim ne de ayıracak vaktim var. Şu foruma bile sürekli bilgisayar başında olduğum için giriyorum. Belki ileride diyelim
    neri yazdıPeki @deathisonitsway macrolardan bahsetmiş. Bu kadar sağlam bir OOP bilgisine sahip olmak gerekiyor mu böyle bir ürün tabloları yaklaşımı için ?

    gerekiyor tabi.sadece bununla değil.OOP bütün projelerinizde gerekiyor.ne kadar iyi tasarlarsanız kodunuzu o kadar kolay refactor edersiniz.
    Aksi durumda laravelle yazmışsınız yazmamışsınız hiç farketmiyor.Kodunuz çöptür...
    GkyKrkc yazdıaraştırırken böyle bir link buldum belki bakmak istersiniz konudan bahsetmiş
    https://www.youtube.com/watch?v=KZ_59Nn0vuU
    İzledim yaklaşım mantığını anlatan güzel bir video paylaştığın için sağol.

    Not: video da 'size' diye bir kolon oluşturmuş o yüzden dinamik yapısını kaybetmiş @mgsmus arkadaşın paylaştığı tablo yapısı daha dinamik, o tablo yapısı gibi bir yapı üzerine odaklanmak daha mantıklı olur.
    neri yazdı
    GkyKrkc yazdıaraştırırken böyle bir link buldum belki bakmak istersiniz konudan bahsetmiş
    https://www.youtube.com/watch?v=KZ_59Nn0vuU
    İzledim yaklaşım mantığını anlatan güzel bir video paylaştığın için sağol.

    Not: video da 'size' diye bir kolon oluşturmuş o yüzden dinamik yapısını kaybetmiş @mgsmus arkadaşın paylaştığı tablo yapısı daha dinamik, o tablo yapısı gibi bir yapı üzerine odaklanmak daha mantıklı olur.
    Kesinlikle katılıyorum, ürünlerin varyantları atanabilir olmalı üzerinde çalışıyorum
    arkadaşlar merhaba, dinamik olarak aşağıdaki tablo mantığını buldum internetten, fakat bununun model - controller ilişkisini nasıl alabilirim ve view e gönderebilirim açıkcası sku kodu oluşturma bölümü ve sku_values kısmı karışık geldi bu konuda bir fikri olan var mı? şimdiden teşekkür ediyorum.
    products:
     ------------------
    | id | name |
     ------------------
    | 1 | t-shirt | 
     ------------------
    
    variants:
     ------------------------------
    | id | product_id | name |
     ------------------------------
    | 1 | 1 | size |
     ------------------------------
    | 2 | 1 | color |
     ----------------------------
    
    variant_options:
     ---------------------------------------------
    | id | product_id | variant_id | name |
    ---------------------------------------------
    | 1 | 1 | 1 | small |
    ---------------------------------------------
    | 2 | 1 | 1 | large |
    ----------------------------------------------
    | 3 | 1 | 2 | red |
    ---------------------------------------------
    | 4 | 1 | 2 | blue |
    ----------------------------------------------
    
    skus:
     -----------------------------------------------
    | id | product_id | sku | price | qty |
    ------------------------------------------------
    | 1 | 1 | 4xx01 | 140 | 5 |
    ------------------------------------------------
    | 2 | 1 | 4xx02 | 140 | 10 |
    ------------------------------------------------
    | 3 | 1 | 4xx03 | 160 | 8 |
    ------------------------------------------------
    | 4 | 1 | 4xx04 | 160 | 15 |
    
    sku_values:
     ----------------------------------------------------------------------
    | id | product_id | variant_id | variant_option_id | skud_id |
    -----------------------------------------------------------------------
    | 1 | 1 | 1 | 1 | 1 |
    -----------------------------------------------------------------------
    | 2 | 1 | 2 | 3 | 1 |
    -----------------------------------------------------------------------
    | 3 | 1 | 1 | 1 | 2 |
    -----------------------------------------------------------------------
    | 4 | 1 | 2 | 4 | 2 |
    -----------------------------------------------------------------------
    | 5 | 1 | 1 | 2 | 3 |
    -----------------------------------------------------------------------
    | 6 | 1 | 2 | 3 | 3 |
    -----------------------------------------------------------------------
    | 7 | 1 | 1 | 2 | 4 |
    -----------------------------------------------------------------------
    | 8 | 1 | 2 | 4 | 3 |
    -----------------------------------------------------------------------
    
    Bu tablo isim açısından biraz karışık. Normalde skus tablosunun adı variants olmalıydı ama neyse, yapan kendince yapmış, nasıl kullanıldığı önemli. Biz karıştırabiliriz ama kendisi karıştırmıyordur.

    Şimdi skus tablosuna bakın, id'si 1 olan kayıta. Bunun SKU kodu 4xx01. Şimdi de sku_values tablosuna bakın, skud_id değeri 1 olanlara, bu alan ile skus tablosu bağlanmış.

    sku_values tablosunu skud_id alanına göre, değeri 1 olacak şekilde gruplarsanız iki tane variant_option_id elde edersiniz. Bunlardan ilki variant_id=1 ve variant_option_id =1 olan, yani size:small, diğeri ise color:red.

    Yani bu ürün özellikleri beden S (small) ve renk Kırmızı (red). Bunu ayrı tabloda tutmuş ki siz ürün detay sayfasında
    beden seçiminde S seçip, renk seçiminde Kırmızı seçip bu 4 değere (2 tane variant_id, 2 tane variant_option_id) bir de product_id ve özellik sayısını (2 adet, beden ve renk, variants tablosundaki product_id ye göre satır sayısı yani) eklerseniz
    skud_id'ye yani skus tablosundaki kayda yani SKU kodu 4xx01 olan varyanta ulaşmış olursunuz.

    Sanırım şu şekilde skud_id değerine ulaşabilirsiniz:
    SELECT 
    	*,
    	(SELECT COUNT(*) FROM variants WHERE product_id = 1) AS variant_count
    FROM sku_values 
    WHERE product_id = 1 AND (
     (variant_id = 1 AND variant_option_id = 1) 
    	OR (variant_id = 2 AND variant_option_id = 3)
    )
    GROUP BY skud_id
    HAVING COUNT(*) = variant_count
    
    mgsmus yazdıBu tablo isim açısından biraz karışık. Normalde skus tablosunun adı variants olmalıydı ama neyse, yapan kendince yapmış, nasıl kullanıldığı önemli. Biz karıştırabiliriz ama kendisi karıştırmıyordur.

    Şimdi skus tablosuna bakın, id'si 1 olan kayıta. Bunun SKU kodu 4xx01. Şimdi de sku_values tablosuna bakın, skud_id değeri 1 olanlara, bu alan ile skus tablosu bağlanmış.

    sku_values tablosunu skud_id alanına göre, değeri 1 olacak şekilde gruplarsanız iki tane variant_option_id elde edersiniz. Bunlardan ilki variant_id=1 ve variant_option_id =1 olan, yani size:small, diğeri ise color:red.

    Yani bu ürün özellikleri beden S (small) ve renk Kırmızı (red). Bunu ayrı tabloda tutmuş ki siz ürün detay sayfasında
    beden seçiminde S seçip, renk seçiminde Kırmızı seçip bu 4 değere (2 tane variant_id, 2 tane variant_option_id) bir de product_id ve özellik sayısını (2 adet, beden ve renk, variants tablosundaki product_id ye göre satır sayısı yani) eklerseniz
    skud_id'ye yani skus tablosundaki kayda yani SKU kodu 4xx01 olan varyanta ulaşmış olursunuz.

    Sanırım şu şekilde skud_id değerine ulaşabilirsiniz:
    SELECT 
    	*,
    	(SELECT COUNT(*) FROM variants WHERE product_id = 1) AS variant_count
    FROM sku_values 
    WHERE product_id = 1 AND (
     (variant_id = 1 AND variant_option_id = 1) 
    	OR (variant_id = 2 AND variant_option_id = 3)
    )
    GROUP BY skud_id
    HAVING COUNT(*) = variant_count
    
    teşekkür ederim üstadım eline sağlık, ben genel mantığı anlamaya çalıştım, çünkü kafamda bişeyler oturmadan algoritma üretemiyorum, hepinizden Allah razı olsun , daha önce yapmış olduğum bir stok takip programı var, onu opsiyonlu ürün satış sistemine çevirmeye çalışıyorum. bir şey kafama takıldı, biz bu SKU kodu yerine barkod numarası kullansak aynı mantığa gelmez mi bu konudaki fikrini öğrenmek isterim.
    Buna Stock Keeping Unit deniyor, kısaca SKU diye geçer. Benim tabloda code dediğim aslında SKU code olmuş oluyor. Onu oluşturmanın, kontrol etmenin yolları var.
    ayrıca bu kontrol mantığından da kısaca bahsedebilir misin
    SKU kodunun ne olduğunun bir önemi yok, her varyant için benzersiz olması yeterli.

    Kontrol mantığını zaten bir önceki yazıda SQL örneği vererek anlattım. Kontrol ile kastettiğim verilen özelliklerden ilgili ürünün varyantına/SKU koduna ulaşılması.