Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?
deathisonitsway yazdı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.
Üstadlar bu işi bir kişi model view contoller olarak yapsada bir etap atlasak olmaz mı ? doğru düzdün yabancı örnek te yok, yani dinamik olarak ne döküman nede video örneği yok, daha önce kimse bu iş üzerine örnek bir çalışma yapmadı mı ? yardımcı olursanız sevinirim. acil yardım lütfen
sen hala yapamadın mı bu işi.oo cok yavaşsın müdür neyi beceremedin öyle hazır kod isteme bizden.
deathisonitsway yazdısen hala yapamadın mı bu işi.oo cok yavaşsın müdür neyi beceremedin öyle hazır kod isteme bizden.
üstad belirli bir aşamaya geldim ama tıkandım, sanki bu işi ilk yapan benmişim gibi hissettim kendimi :)) internette ne yazılı nede görsel başka bir örneği yok, dinamik olanına rastlamadım yani,

controller
$product=Product::find($id);
 //$options=Option::all();
 $options=Product::find($id)->options()->get();
 $option_name=[];
 $option_name=[];
 $deg=[];
 foreach ($options as $i){

 $val=ProductOptionValue::where('option_id',$i->id)->get();
 foreach ($val as $v){
 $deg[]=['value'=>$v->name];
 }
 $option_name[]=$i->name;
 
 }

 return $x=array(
 'product'=>$product->name,
 'atribute'=>$option_name,
 'deger'=>$deg,
 );
çıktı :
{
product: "Nizva Bisiklet Yaka",
atribute: [
"Beden",
"Renk"
],
deger: [
{
value: "Small"
},
{
value: "Large"
},
{
value: "X Large"
},
{
value: "Bakır"
},
{
value: "Gümüş"
},
{
value: "Kırmızı"
}
]
}
şimdi ben istiyorum ki bu değer kısmının ilgili üyeleri ilgili atribute başlığının altında dizi olarak yer alsın ama yapamadım .
Babam formatın yalnış bence,konuyu okumamışsın ki sen,her bir attribute için eşleme yapman lazım değerlerin için.
Mgsmus kadar kaliteli anlatamam belki ama,konuyu tekrar bir okumanda fayda var.

artı olarak kodun clean değil.Basıp geçmelik kod yazıyorsun.Yapma derim sana.Özen göster uygulamana.

$product=Product::find($id);
 
 $options=Product::find($id)->options()->get();

kod tekrarı var fazladan query yapıyorsun.her bir query maliyet demektir.


$product=Product::find($id);
 
 $options=$product->options()->get();

böyle olmalı... değişken tanımlamaların kötü.
$data = [
 'Beden' => [
 'Small',
 'Large',
 'X-Large'
 ],
 'Renk' => [
 'Bakır',
 'Gümüş',
 'Kırmızı'
 ]
];

$result = [[]];

foreach ($data as $key => $value) {
 $tmp = [];
 foreach ($result as $res) {
 foreach ($value as $val) {
 $tmp[] = array_merge($res, [
 $key => $val
 ]);
 }
 }
 $result = $tmp;
}


print_r($result);
Array
(
 [0] => Array
 (
 [Beden] => Small
 [Renk] => Bakır
 )

 [1] => Array
 (
 [Beden] => Small
 [Renk] => Gümüş
 )

 [2] => Array
 (
 [Beden] => Small
 [Renk] => Kırmızı
 )

 [3] => Array
 (
 [Beden] => Large
 [Renk] => Bakır
 )

 [4] => Array
 (
 [Beden] => Large
 [Renk] => Gümüş
 )

 [5] => Array
 (
 [Beden] => Large
 [Renk] => Kırmızı
 )

 [6] => Array
 (
 [Beden] => X-Large
 [Renk] => Bakır
 )

 [7] => Array
 (
 [Beden] => X-Large
 [Renk] => Gümüş
 )

 [8] => Array
 (
 [Beden] => X-Large
 [Renk] => Kırmızı
 )

)
$data = [
 'Beden' => [
 'Small',
 'Large',
 'X-Large'
 ],
 'Renk' => [
 'Bakır',
 'Gümüş',
 'Kırmızı'
 ]
];
üstad ben bu datayı senin yaptığın gibi düzenli dizi haline getiremedim, controller edit kodum aşağıda
$product=Product::find($id);
 $options=$product->options()->get();
 $option_name=[];
 $deg=[];
 foreach ($options as $i){

 $val=ProductOptionValue::where('option_id',$i->id)->get();
 foreach ($val as $v){
 $deg[]=['value'=>$v->name];
 }
 $option_name[]=$i->name;
 }

 return $varyants=array(
 'product'=>$product->name,
 'atribute'=>$option_name,
 'deger'=>$deg,
 );
sanırım php de dizi ve döngüler kısımına iyi çalışmam lazım, istenilen dizi nasıl oluşturulur, oluşan dizi nasıl parçalanır nasıl birleştirilir ve döngüye sokularak çıktıya dönüştürülür, biraz çalışmam gerekiyor.
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