Asp - Php - Cgi - Perl
[PHP - MYSQL] - Varyant Sistemi İle İlgili Beyin Fırtınası İsteği
[PHP - MYSQL] - Varyant Sistemi İle İlgili Beyin Fırtınası İsteği
-
(SKU - Stok Keeping Unit diye geçer) diye bir kavram var. Her bir varyanta ürün kodu oluşturup sisteme alt ürün olarak ekletmek.
Aşağıdaki URL de bu konuda güzel bir tartışma yapılmış. İncelemenizi tavsiye ederim.
https://laracasts.com/discuss/channels/general-discussion/custom-ecommerce-dynamic-product-variants
-
SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for secenekler -- ---------------------------- DROP TABLE IF EXISTS `secenekler`; CREATE TABLE `secenekler` ( `secenek_id` int(11) NOT NULL AUTO_INCREMENT, `secenek_adi` varchar(255) DEFAULT NULL, PRIMARY KEY (`secenek_id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of secenekler -- ---------------------------- INSERT INTO `secenekler` VALUES ('1', 'Beden'); INSERT INTO `secenekler` VALUES ('2', 'Renk'); INSERT INTO `secenekler` VALUES ('3', 'Yaka'); INSERT INTO `secenekler` VALUES ('4', 'Kol'); -- ---------------------------- -- Table structure for secenek_degerleri -- ---------------------------- DROP TABLE IF EXISTS `secenek_degerleri`; CREATE TABLE `secenek_degerleri` ( `secenek_deger_id` int(11) NOT NULL AUTO_INCREMENT, `secenek_id` int(11) DEFAULT NULL, `deger_adi` varchar(255) DEFAULT NULL, PRIMARY KEY (`secenek_deger_id`), KEY `secenek_id` (`secenek_id`), CONSTRAINT `secenek_degerleri_ibfk_1` FOREIGN KEY (`secenek_id`) REFERENCES `secenekler` (`secenek_id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of secenek_degerleri -- ---------------------------- INSERT INTO `secenek_degerleri` VALUES ('1', '1', 'XS'); INSERT INTO `secenek_degerleri` VALUES ('2', '1', 'S'); INSERT INTO `secenek_degerleri` VALUES ('3', '1', 'M'); INSERT INTO `secenek_degerleri` VALUES ('4', '1', 'L'); INSERT INTO `secenek_degerleri` VALUES ('5', '1', 'XL'); INSERT INTO `secenek_degerleri` VALUES ('6', '1', 'XXL'); INSERT INTO `secenek_degerleri` VALUES ('7', '2', 'Kırmızı'); INSERT INTO `secenek_degerleri` VALUES ('8', '2', 'Mavi'); INSERT INTO `secenek_degerleri` VALUES ('9', '2', 'Mor'); INSERT INTO `secenek_degerleri` VALUES ('10', '2', 'Yeşil'); INSERT INTO `secenek_degerleri` VALUES ('11', '3', 'Bisiklet'); INSERT INTO `secenek_degerleri` VALUES ('12', '3', 'Polo Yaka'); INSERT INTO `secenek_degerleri` VALUES ('13', '4', 'Uzun'); INSERT INTO `secenek_degerleri` VALUES ('14', '4', 'Kısa'); -- ---------------------------- -- Table structure for urunler -- ---------------------------- DROP TABLE IF EXISTS `urunler`; CREATE TABLE `urunler` ( `urun_id` int(11) NOT NULL AUTO_INCREMENT, `urun_adi` varchar(255) DEFAULT NULL, PRIMARY KEY (`urun_id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of urunler -- ---------------------------- INSERT INTO `urunler` VALUES ('1', 'TBT Tişört'); INSERT INTO `urunler` VALUES ('2', 'TBT Don'); -- ---------------------------- -- Table structure for varyantlar -- ---------------------------- DROP TABLE IF EXISTS `varyantlar`; CREATE TABLE `varyantlar` ( `varyant_id` int(11) NOT NULL AUTO_INCREMENT, `urun_id` int(11) DEFAULT NULL, PRIMARY KEY (`varyant_id`), KEY `urun_id` (`urun_id`), CONSTRAINT `varyantlar_ibfk_1` FOREIGN KEY (`urun_id`) REFERENCES `urunler` (`urun_id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of varyantlar -- ---------------------------- INSERT INTO `varyantlar` VALUES ('1', '1'); INSERT INTO `varyantlar` VALUES ('2', '1'); INSERT INTO `varyantlar` VALUES ('3', '1'); INSERT INTO `varyantlar` VALUES ('4', '2'); INSERT INTO `varyantlar` VALUES ('5', '2'); -- ---------------------------- -- Table structure for varyant_degerler -- ---------------------------- DROP TABLE IF EXISTS `varyant_degerler`; CREATE TABLE `varyant_degerler` ( `id` int(11) NOT NULL AUTO_INCREMENT, `varyant_id` int(11) DEFAULT NULL, `secenek_id` int(11) DEFAULT NULL, `secenek_deger_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `varyant_id` (`varyant_id`), KEY `secenek_id` (`secenek_id`), KEY `secenek_deger_id` (`secenek_deger_id`), CONSTRAINT `varyant_degerler_ibfk_1` FOREIGN KEY (`varyant_id`) REFERENCES `varyantlar` (`varyant_id`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `varyant_degerler_ibfk_2` FOREIGN KEY (`secenek_id`) REFERENCES `secenekler` (`secenek_id`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `varyant_degerler_ibfk_3` FOREIGN KEY (`secenek_deger_id`) REFERENCES `secenek_degerleri` (`secenek_deger_id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of varyant_degerler -- ---------------------------- INSERT INTO `varyant_degerler` VALUES ('1', '1', '1', '3'); INSERT INTO `varyant_degerler` VALUES ('2', '1', '2', '8'); INSERT INTO `varyant_degerler` VALUES ('3', '1', '3', '11'); INSERT INTO `varyant_degerler` VALUES ('4', '1', '4', '14'); INSERT INTO `varyant_degerler` VALUES ('5', '2', '1', '1'); INSERT INTO `varyant_degerler` VALUES ('6', '2', '2', '9'); INSERT INTO `varyant_degerler` VALUES ('7', '2', '3', '12'); INSERT INTO `varyant_degerler` VALUES ('8', '2', '4', '13'); INSERT INTO `varyant_degerler` VALUES ('9', '3', '1', '6'); INSERT INTO `varyant_degerler` VALUES ('10', '3', '2', '7'); INSERT INTO `varyant_degerler` VALUES ('11', '4', '1', '6'); INSERT INTO `varyant_degerler` VALUES ('12', '4', '2', '7'); INSERT INTO `varyant_degerler` VALUES ('13', '5', '1', '1'); INSERT INTO `varyant_degerler` VALUES ('14', '5', '2', '8');
boyle bişi yaptım ama
sorguda boyle
stokta varyantları tutacan
select a.varyant_id, c.urun_adi, GROUP_CONCAT(d.deger_adi) as varyant_ozellikleri from (select * from varyant_degerler) as a LEFT JOIN (select * from varyantlar) as b on b.varyant_id=a.varyant_id LEFT JOIN (select * from urunler) as c on c.urun_id=b.urun_id LEFT JOIN (select * from secenek_degerleri) as d on d.secenek_deger_id=a.secenek_deger_id GROUP BY a.varyant_id
-
Eticaret sektorunde danismanlik yaptigim firmalarda gordugum sey
Kirmizi
Mavi
Siyah
Farklin urunler ve farkli stok kodlarina ait olmaktadir.
Hatta bedene gore de stok kodlarini ayristirmajta farklilik.var.
Atlet kirmizi m
Atlet kirmizi s
Atlet kirmizi l tek urun stok kodu
Atlet siyah sml farkli stok kodu
Bu sekilde olusturmalisin
-
coder2 bunu yazdı
(SKU - Stok Keeping Unit diye geçer) diye bir kavram var. Her bir varyanta ürün kodu oluşturup sisteme alt ürün olarak ekletmek.
Aşağıdaki URL de bu konuda güzel bir tartışma yapılmış. İncelemenizi tavsiye ederim.
https://laracasts.com/discuss/channels/general-discussion/custom-ecommerce-dynamic-product-variants
İlginçmiş hocam, attım fava inceleyeceğim bende.
-
iyice kafam karıştı :D
opensource yazılımlara göz atıyorum.
-
daha kolay anlayabil diye senin gönderiğin imaj üzerinde düzenleme yaptım hocam :)
bu adımda yapman gereken tek şey "ÜRÜN VARYANTLARI" tablosuna stok ekleyip ordan takip etmek :)
kolay gelsin.
-
en pratik ve anlaşılırı aşağıdaki yapı gibi ama bunda ürün stoğunu hangi sorgu ile alacağım. mesela ziyaretçi siteden kırmızı ve small'u seçti. tabloda bunu nasıl bir sorgu ile kontrol edeceğim?
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 | -----------------------------------------------------------------------
-
her bir rengi ayrı ürün olarak tut ve attributelarla birbirine bağla hocam.
dijital reklam firmasında çalışıyorum, büyük perakendeciler müşterimiz. bu şekilde yapıyorlar çünkü :
stokları ayrı ayrı takip edebiliyorsun
stoğu az olana kampanya yapmak gibi şeyler daha kolay oluyor
reklam çıkarken tam istediğin ürüne çıkabiliyorsun.
vs vs bir sürü avantajın olacak
-
pmden sorduğun soruya buraya cevap vereyim hocam :) senin tablo yapısını inceleme şansım olmadı ama ben şu şekilde yapardım :)
--MıxedVariantChild tablosuna da RowId(identity), ProductId ve VariantOptionId eklemen gerekiyormuş şimdi farkettim :) --aşağıdaki değerlerin bir yerden geldiğini varsayıyorum DECLARE @variantId1 AS INT =1 --renk varyantı DECLARE @variantId2 AS INT =2 --beden varyantı DECLARE @variantValue1 AS INT =1 --kırmızı valuesi DECLARE @variant1Value2 AS INT =2 --small valuesi SELECT * FROM ProductsVariants WHERE ProductId IN ( SELECT ProductId FROM MixedVariantChild WHERE (VariantId=@variantId1 AND VariantOptionId=@variantValue1) OR (VariantId=@variantId2 AND VariantOptionId=@variant1Value2) )
Yolbulucunun dediği yöntem de mantıklı ama tercih meselesi tabi.
yazarken ufak tefek mantık hataları çıkabilr. ama genel mantık bu şekilde en azından.
manglerman tarafından 01/Kas/19 09:57 tarihinde düzenlenmiştir -
hocalar konuyu anladım; sindirdim. hepinize ayrı ayrı teşekkür ederim.