Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?
Eğer Product, ProductOption (ör. options() adıyla) ve ProductOptionValue (ör. optionValues() adıyla) arasında doğru ilişkiyi kurduysanız:
$product = Product::with('options.optionValues')->find($id);
şeklinde tüm ilişkiyi çekebilirsiniz. Daha sonra:
$data = [];

foreach($product->options as $option) {
 $data[$option->name] = $option->optionValues->pluck('name');
}
gibi diziyi oluşturabilirsiniz. Benim verdiklerim size yol göstermesi için, o yüzden direkt çalışmayabilir. Kendinize düzenlersiniz.

Bunu yapmanın daha farklı yolları da var. Örneğin Collection kullanmak gibi ama şu an ezbere, test etmeden yazamıyorum. Dokümanlara bakabilirsiniz:
https://laravel.com/docs/5.8/collections
sen varya sennnnn Allahım esirgesin maşallah, işte istediğim tam buydu, teşekkür ediyorum. bu işi bitirdiğimde tüm model ve controlleri buraya yazacam inşallah , aralarda sorularım gelebilir yine şimdiden teşekkürler
5 gün sonra
Burada bir soru aklıma takıldı, şimdi PRD00011-L-MAVI şeklinde sku kodlu ürün tanımladım diyelim, ve bu ürüne yönelik çıkışlar yaptık, stokta bir miktar PRD00011-L-MAVI kodlu ürün kaldı, daha sonra aynı ürüne bir varyasyon daha ekledim diyelim, bu durumda sku koduda PRD00011-L-MAVI-İPEK şeklinde değiştiğini var sayarsak, ilk çıkış ürünlerindeki sku kodu ile sonraki arasında bir fark olmuş olacak, yani faturalı stok takip çıkışı yapılan eski faturalarda eski kod yer almış olacak, sku kodundaki bu durumları ileride stok takip sistemini bozmamak için nasıl bir algoritmaya dayandırmak lazım ? varyantları oluşturduktan sonra hiç dokunmamak mı daha iyi, yani, düzenleme yapılmaması manasında fikirlerinizi bekliyorum.selamlar.
bir yıl sonra

Merhaba ,tamamladıysanız eğer kodlarınızı paylaşabilir misiniz ?

12 gün sonra

mgsmus bu yapıya göre varyantsız ürünler nasıl ekleniyor ? Onun için yapıyı ayırmak mı gerekli ?

Varyantlı ürünüler - Control Model View
Varyantsız Ürünler - Controller Model View gibi ? umarım anlatabilmişimdir

    İşin zorluk derecesini size kısaca anlatayım, 17 yıldır yazılım işi ile uğraşmama rağmen yaklaşık 1 haftadır bu konu ile ilgili uğraşıyorum. @mgsmus 'un dediği gibi, tekli ürün sistemi olan hali hazırda bir e-ticaret sitesine uygulamakta işi daha da zorlaştırıyor. Sıfırdan tekli ürünün de varyasyon muş gibi eklendiği bir yapı kurmak daha mantıklı geliyor.

    Mesela ürün varyasyonu eklemek kısmına kadar gelmek bir nebze kolay, ancak iş stok kontrolünde bitiyor. Örneğin Mavi renk seçildi ancak o renkte elinizde 5 KG seçeneği kalmamış. Ya da ilk olarak kullanıcı varyasyon seçmeye üstten değil de, alttan seçmeye başladı. Önce ağırlık seçti 5 KG, bu durumda mavi renk pasifleşmeli gibi. Kademeli olarak seçtirmek işi belki çözebilir ancak profesyonel ve mümkün olduğunca esnek bir yapıda olsun derseniz çok zorlaşıyor.

    Örneğin Trendyol, 64 - 128 GB hafızalı, Beyaz - Mavi - Siyah renklerinde telefon sattığını düşünelim. Burada çarprazlama istediğiniz yerden başlayarak seçim yapabiliyorsunuz. İster önce hafıza seçin, isterseniz renk. Ancak bazı sistemlerde ise ikinci varyasyonu seçmeden önce şunu seçmelisiniz gibi uyarı vererek, kullanıcı yukarıdan aşağı doğru sıralama ile seçmeye zorluyor. Bu biraz daha kolay olabilir ama önemli olan zoru başarmak 🙂

    @izmiralem @kartal Size bir tüyo daha vereyim. Siparişleri orders tablosunda tek bir sipariş olarak tutmayın. orders tablosunda ana siparişi tutun. suborders gibi bir tabloda normal siparişi tutun, tutarı vs ile birlikte. Bu şekilde yaparsanız parçalı sipariş özelliği kullanabilirsiniz. Örneğin Migros'ta bir sipariş veriyorsunuz, sipariş gelmeden sepete ekleme yapabiliyorsunuz. Diyelim ki Pazartesi sipariş verdiniz, Çarşamba teslim edilecek. Salı günü sepete 2 ürün daha ekleme yapıyorsunuz. Migros mevcut siparişi değiştirmiyor, 2 üründen yeni bir sipariş daha oluşturuyor ama her iki siparişi de tek bir sipariş altında gösteriyor. Böylece bekleyen siparişteki ürün değişiminde örneğin kampanyalardan çıkacak sorunların önüne geçiyor.

      mgsmus Size bir tüyo daha vereyim. Siparişleri orders tablosunda tek bir sipariş olarak tutmayın. orders tablosunda ana siparişi tutun. suborders gibi bir tabloda normal siparişi tutun, tutarı vs ile birlikte. Bu şekilde yaparsanız parçalı sipariş özelliği kullanabilirsiniz. Örneğin Migros’ta bir sipariş veriyorsunuz, sipariş gelmeden sepete ekleme yapabiliyorsunuz. Diyelim ki Pazartesi sipariş verdiniz, Çarşamba teslim edilecek. Salı günü sepete 2 ürün daha ekleme yapıyorsunuz. Migros mevcut siparişi değiştirmiyor, 2 üründen yeni bir sipariş daha oluşturuyor ama her iki siparişi de tek bir sipariş altında gösteriyor. Böylece bekleyen siparişteki ürün değişiminde örneğin kampanyalardan çıkacak sorunların önüne geçiyor.

      hocam konuştukça kafamızı açıyorsunuz vallahi böyle şeyleri nasıl öğreniyorsunuz ? Githubta gitlabta yapılan projeleri oturup inceliyorum sizin bu anlattığınız sku sistemini uygulayan görmedim. Hani kendimizi geliştirmek için kod okumaya özen gösteriyorum ama böyle şeyleri sanıyorum kurumsal bir firmada ihtiyaç olmadan anlayamacağım., Birde şurda kafam karıştı

      Migros’ta bir sipariş veriyorsunuz, sipariş gelmeden

      Biz zaten kartta yani sepetimde tutuyoruz ürünü müşteri onaylayana kadar bekliyor ki 2 gün içerisinde stok biterse işlem yapamıyor haliyle. Burda ki sipariş gelmeden ki kasıt nedir hocam ? Tamamlanan Her siparişin kendi idsi var,2 siparişide tamamlarsa idleri farklı,istediğimizdan iade yapabiliyoruz. Biz mi yanlış kurguladık acaba diye bir düşünmedim değil Birde tablo yapısına yukarıda ki gibi örnekle açıklayabilirseniz çok sevinirim. Saygılarımı sunuyorum

        • mgsmus

          Seviye 1382
        • Düzenlendi

        kartal Siz Migros'tan sipariş verince teslimat tarihi seçiyorsunuz. Ön otorizasyon ile paraya bloke koyuyor. Teslimat tarihine belli bir süreye kadar sepete ekleme çıkarma yapmanıza izin veriyor. Ekleme yaparsanız onu alt sipariş olarak kaydediyor fakat o da ana sipariş altında yer aldığı için aynı anda teslim ediliyor. Ekleme yaptığınız ürünleri ayrıca ödemenizi istiyor, onun ödemesi de ayrı yapılıyor. Teslim edilinceye kadar sipariş tamamlandı sayılmıyor. Teslim edilince kartınızdan, bloke edilen tutardan sipariş tutarı kadar çekilip kalanı bırakılıyor yani provizyon satışa çevriliyor. Ekleme yaptıysanız o ek siparişin de aynı şekilde provizyonu satışa çevriliyor. Sipariş o zaman tamamlandı oluyor. Bu market olduğu için ona göre dizayn edilmiş, o yüzden klasik eticaretten farklı. Örneğin sepete attığım ürün yoksa alternatifini getir diye bir seçenek var. Bazı durumlarda stokda gözükse bile ürün olmayabiliyor, hasarlı çıkması gibi sebeplerden ötürü. O seçeneği işaretlediyseniz aynı ürünün başka markasını getiriyorlar. Eğer o ürün diğerinden pahalı ise elbette sipariş tutarı artıyor. Bunun sorun olmasını engellemek için de Migros'tan alışveriş yaptığınızda aslında kartınızda sipariş tutarından daha fazla ücrete bloke koyuyor. Örneğin 100 TL'lik alışveriş yapınca 110 TL bloke koyuyor. Sipariş, ürünün fiyatı değişmesi durumunda 105 TL'ye çıkmışsa 110 TL bloke içinden 105 TL'si alınıyor. Böylece ek ödeme çıkmıyor. Diğer bir olay da Migros'ta siparişi ileri bir tarihe erteleme var, şu gün getir diye. Öyle yaptığınızda o günün fiyatları ile siparişiniz toplanıyor. Yani Pazartesi 100 TL olarak verdiğiniz sipariş Cuma günü size 102 TL olarak gelebilir. Elbette bunda hiçbir sıkıntı yok çünkü üye olurken bu şartları kabul etmiş oluyorsunuz. Bunun gibi farklı sektörlerdeki eticaretlerde çok fazla değişen durum var, işini yaptığınız sektöre göre kurgulamalısınız. Bu iş sadece sepete at, öde, bekle olayı değil.

        Tablo yapısı da sanırım ek sipariş olayını soruyorsunuz, kabaca şöyle:

        orders
        +----+---------+---------------------+
        | id | user_id |     order_date      |
        +----+---------+---------------------+
        |  1 |       1 | 2020-06-27 10:00:00 |
        +----+---------+---------------------+
        
        suborders
        +----+----------+-------+---------------------+
        | id | order_id | total |     order_date      |
        +----+----------+-------+---------------------+
        |  1 |        1 | 20.00 | 2020-06-27 10:00:00 |
        |  1 |        1 | 53.75 | 2020-06-27 12:30:00 |
        +----+----------+-------+---------------------+

          mgsmus 100 TL’lik alışveriş yapınca 110 TL bloke koyuyor

          hocam ne güzel özetlemişşiniz dilinize elinize klavyenize sağlık . Şu kısımda sanıyorum sitede ki üyelerin bakiyeleri var galiba ona göre mi koyuyorr blokeyi ? Yoksa onuda veritabanı yada sessionda tutup o an ki tutar ve 2 gün sonra fiyatı değiştiyse onu hesaplayıp ona göre mi koyuyor blokeyi, yemin ediyorum kafam teslanın elektrik deneylerinde ki gibi şimşekler çakmaya başladı 😃

            kartal Sabit bir oran var. Mesela toplam alışveriş tutarının %10 fazlası kadar şeklinde.

              mgsmus mustafa abi bu açıklamalarından sonra oturdum kendi kendime birşeyler çıkarmaya başladım hem burda ki arkadaşlara örnek olması açısından hemde eksik kaldığım içinden çıkamadım bir kaç şey var. Kodlarımı inceleyip eksik hatalı yanlış yaptığım yerleri söyleyebilir misin https://github.com/metapodcod/laraveldynamicproductvariants

              @mgsmus hocam, şimdi mysql'de yaptığımız sorgularda grup olarak nasıl arayabiliriz. Yaptığım sisteme göre SKU numarasını ilişkileri tutan tablodan alıyorum, bunu bir türlü çözemedim.

              Örneğin verilerimiz:
              gelen_veri
              veri array veya herhangi bir şekilde post olarak da gelebilir. Ancak nitelik_Id = 1 tanim_Id = 2 ve nitelik_Id = 6 tanim_Id = 7.
              Mysql sorgu sonucu ile yukarıda ki kriterlere tam olarak uyan SKU alacağım. Aşağıda ki tabloya göre 1 numaralı ürüne ait SKU1 dönmeli.

              urun_sema
              Id - urun_grup - nitelik_Id - tanim_Id - urun_Id - SKU
              1 - urun_grup - 1 - 2 - 1 - SKU1
              2 - urun_grup - 6 - 7 - 1 - SKU1

              3 - urun_grup - 1 - 2 - 1 - SKU2
              4 - urun_grup - 6 - 8 - 1 - SKU2
              5 - urun_grup - 1 - 2 - 1 - SKU3
              6 - urun_grup - 6 - 9 - 1 - SKU3
              7 - urun_grup - 1 - 3 - 2 - SKU4
              8 - urun_grup - 6 - 7 - 2 - SKU4
              9 - urun_grup - 1 - 3 - 3 - SKU5
              10 - urun_grup - 6 - 4 - 3 - SKU5

              9 ay sonra

              mgsmus Merhaba Hocam,
              2 Gündür Buradaki Yazıları ve Diğer https://laravel.gen.tr/d/2771-e-ticaret-sistemi/7 Adresindeki Yazılarını Okuyorum ve Ürünler Varyasyon Olayını Çözmeye Çalışıyorum.

              Urunler
              +---+------------+---------------+
              | ID | StokKodu | UrunAdi
              +---+------------+---------------+
              | 1 | DP01 | Elbise |
              +---+------------+---------------+

              UrunVaryasyonlar
              +---+---------+------------------+
              | ID | UrunID | VaryasyonAdi
              +---+---------+------------------+
              | 1 | 1 | Beden |
              | 2 | 1 | Renk |
              +---+---------+------------------+

              UrunVaryasyonSecenekleri
              +---+---------+-----------------+----------------+-------------+
              | ID | UrunID | VaryasyonID | SecenekAdi | SkuKodu
              +---+---------+-----------------+----------------+-------------+
              | 1 | 1 | 1 | Small | S |
              | 2 | 1 | 1 | Medium | M |
              | 3 | 1 | 1 | Large | L |
              | 4 | 1 | 2 | Beyaz | B |
              | 5 | 1 | 2 | Siyah | S |
              | 6 | 1 | 2 | Mavi | M |
              +---+---------+-----------------+----------------+-------------+

              UrunSKU
              +---+---------+------+---------------------------+------+---------------+--------------+
              | ID | UrunID | Sku | VaryasyonSecenekID| Fiyat | StokMiktari | AktifPasif
              +---+---------+------+---------------------------+------+---------------+--------------+
              | 1 | 1 | DP01-S-B | 1,4 | 10,00 | 5 | 1 |
              | 2 | 1 | DP01-M-B | 2,4 |15,00 | 10 | 1 |
              | 3 | 1 | DP01-L-B | 3,4 | 20,00 | 15 | 1 |
              | 4 | 1 | DP01-S-S | 1,5 | 25,00 | 20 | 1 |
              | 5 | 1 | DP01-M-S | 2,5 | 30,00 | 25 | 1 |
              | 6 | 1 | DP01-L-S | 3,5 | 35,00 | 30 | 1 |
              | 7 | 1 | DP01-S-M | 1,6 | 40,00 | 50 | 0 |
              | 8 | 1 | DP01-M-M | 2,6 | 45,00 | 50 | 0 |
              | 9 | 1 | DP01-L-M | 3,6 | 50,00 | 50 | 0 |
              +---+---------+------+---------------------------+------+---------------+--------------+

              Bu Şekilde Tablo Oluşturdum. "UrunSKU" Adlı Tablomun Olup Olmadığı Hakkında ve Kullanıcı İlgili Varyasyonları Seçerken Bu Tablo İle Stok Kontrolü ve Fiyat Kontrolünü Yapabilir miyim Bilemedim.

              VaryasyonSecenekID Ne İçin Yaptınız Diye Soracak Olursanız;
              Kullanıcı Varyasyon Secimi Yaptığında Karsısına O Varyasyonla Birlikte Secilecek Olan 2. Varyasyon Varsa 3.Varyasyon Hatda Varsa 4.Varyasyonları Listelemek İçin Karşılastırma İşlemini Yapabilmek İçin Oluşturdum.

              Tabi Bu İşlemleri Yapıp Yapamayacağım Konusunda Kafamda Oturmuş Net Bir Durum Yok.

              Bu Konu Hakkında Yardımcı Olabilir misiniz ?

                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.

                  Hocam Cevabınız İçin Teşekkür Ederim. Tablo İsimlendirmelerini Genellikle Türkçe Kullandığım İçin Biraz Karışık Oluyor. Bu Sefer Sanırım Olayı Çözdüm. Birazdan Uygulamaya Geçeceğim. Yalnız Aklıma Bir şey Takıldı.

                  Bu Durumda Kullanıcı S Bedenini Seçtikten Sonra S Bedenine Ait Kırmızı Renkteki Ürünün Stokta Olup Olmadığını Nasıl Gösterebiliriz.

                  Ayrıca,

                  Anlattığınız Sistemde İlerde Karşımıza Çıkabilecek Herhangi Bir Sorun Var mı ?

                    kadirakkus9 Stoğu sizin yaptığınız gibi varyant tablosunda tutuyorsanız varyanta ulaştınız mı zaten stocğa da ulaşmış oluyorsunuz. Benim dediğim gibi product_stock kullanırsanız shop_id ve variant_id ile o tabloya sorgu atacaksınız.

                    kadirakkus9 Anlattığınız Sistemde İlerde Karşımıza Çıkabilecek Herhangi Bir Sorun Var mı ?

                    Kesinlikle Öyle Bir Şey Söz Konusu Olamaz, Garantisi Bizzat Şahsım. Bunu 4 Kişiye Daha Anlattım, Biri Hepsiburada’yı, Diğeri Trendyol’u, Bir Diğeri De Gittigidiyor’u Kurdu. 4. Kişi Bu Bana Pek Uymadı Dedi, O Da Nevzat 🙂 Tabi ki sorun vardır, siz ilerledikçe karşınıza çıkar, ben sadece kitabın önsözünü yazdım size.

                    Verdiğiniz Bilgiler İçin Teşekkür Ederim Hocam.

                    9 ay sonra

                    Merhaba @mgsmus discount_price alanını product_stock tablosuna mı eklemek mantıklı yoksa product_discounts adında tablo açmak mı daha efektif bir kullanım olur.2. sorumda kategoride lft ve rgt migration ile biz ekliyoruz dime(nested ile bir alakası yok) lft ve rgt create ederken nasıl bir mantık ile değerlerini veriyoruz.
                    3.sorum ürün url slug ile aratacağım . ürünün slug vartiantta mı tutulmalı