PHP编码实践:如何实现商品多规格SKU功能

1. 商品规格介绍

在实际生产销售过程中,商品的多样性是非常必要和重要的,而不同规格的商品在市场上的需求也是不同的。因此,在网站开发过程中需要考虑到商品规格的实现。在一些电商平台,例如淘宝、京东等,我们可以看到商品有多个规格,如颜色、尺寸、材质等,这些规格就是我们所说的SKU(Stock Keeping Unit),通过SKU可以唯一标识不同的商品规格。

2. 如何实现商品多规格SKU功能

2.1 数据库表设计

在实现SKU功能之前,首先需要对其进行数据库表的设计。在设计时,需要考虑商品的基本信息和规格信息以及两者之间的关系。一般来说,我们需要建立三个表,分别是商品表、规格表和关联表。商品表用来存储商品的基本信息,规格表用来存储规格的信息,关联表用来记录商品和规格之间的关联关系。具体的表设计如下:

CREATE TABLE `goods` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品ID',

`name` varchar(128) NOT NULL COMMENT '商品名称',

`price` decimal(10,2) unsigned NOT NULL COMMENT '商品价格',

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';

CREATE TABLE `spec` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '规格ID',

`name` varchar(32) NOT NULL COMMENT '规格名称',

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='规格表';

CREATE TABLE `spec_item` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '规格项ID',

`spec_id` int(11) unsigned NOT NULL COMMENT '规格ID',

`name` varchar(32) NOT NULL COMMENT '规格项名称',

PRIMARY KEY (`id`),

KEY `spec_id` (`spec_id`),

CONSTRAINT `spec_item_ibfk_1` FOREIGN KEY (`spec_id`) REFERENCES `spec` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='规格项表';

CREATE TABLE `goods_spec` (

`goods_id` int(11) unsigned NOT NULL COMMENT '商品ID',

`spec_id` int(11) unsigned NOT NULL COMMENT '规格ID',

`spec_item_id` int(11) unsigned NOT NULL COMMENT '规格项ID',

PRIMARY KEY (`goods_id`,`spec_id`),

KEY `spec_item_id` (`spec_item_id`),

CONSTRAINT `goods_spec_ibfk_1` FOREIGN KEY (`goods_id`) REFERENCES `goods` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,

CONSTRAINT `goods_spec_ibfk_2` FOREIGN KEY (`spec_id`) REFERENCES `spec` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,

CONSTRAINT `goods_spec_ibfk_3` FOREIGN KEY (`spec_item_id`) REFERENCES `spec_item` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品规格关系表';

2.2 SKU商品展示页面设计

在展示SKU商品的页面中,需要展示商品的图片、名称、价格、规格等信息。而规格信息需要通过前端选择器进行选择和展示。其中,在我们选择一个规格后,需要根据已经选择的规格来显示该规格对应的商品价格和图片等信息。

接下来,我们来看一段前端代码,用来展示商品规格和价格信息。

<div class="sku-item">

<h3 class="sku-title">颜色</h3>

<ul class="sku-list">

<li class="sku-item" data-spec-id="1" data-spec-item-id="2">黑色</li>

<li class="sku-item" data-spec-id="1" data-spec-item-id="3">白色</li>

<li class="sku-item" data-spec-id="1" data-spec-item-id="4">蓝色</li>

</ul>

</div>

<div class="sku-item">

<h3 class="sku-title">尺寸</h3>

<ul class="sku-list">

<li class="sku-item" data-spec-id="2" data-spec-item-id="5">S</li>

<li class="sku-item" data-spec-id="2" data-spec-item-id="6">M</li>

<li class="sku-item" data-spec-id="2" data-spec-item-id="7">L</li>

</ul>

</div>

<div class="sku-price">价格:<strong id="J_skuPrice"></strong></div>

2.3 SKU商品查询实现

在商品和规格信息之间建立好关系之后,我们需要在后台实现SKU商品的查询和展示。以获取全部SKU商品价格为例,下面是一段简单的示例代码。

$goodsId = 1; // 商品ID

// 获取商品对应的规格信息

$sql = 'SELECT spec_id, spec_item_id FROM goods_spec WHERE goods_id=:goods_id';

$stmt = $pdo->prepare($sql);

$stmt->bindParam(':goods_id', $goodsId, PDO::PARAM_INT);

$stmt->execute();

$specs = $stmt->fetchAll(PDO::FETCH_ASSOC);

// 拼接SQL语句查询SKU商品

$sql = 'SELECT price FROM goods';

foreach ($specs as $spec) {

$sql .= ' INNER JOIN goods_spec AS gs' . $spec['spec_id'] .

' ON gs' . $spec['spec_id'] . '.goods_id = goods.id AND gs' . $spec['spec_id'] . '.spec_id=' . $spec['spec_id'] .

' AND gs' . $spec['spec_id'] . '.spec_item_id=' . $spec['spec_item_id'];

}

$stmt = $pdo->prepare($sql);

$stmt->execute();

$skuPrice = $stmt->fetch(PDO::FETCH_ASSOC)['price'];

这段代码先获取了商品对应的规格信息,然后通过规格信息拼接SQL语句查询SKU商品的价格。这里需要注意的是,在拼接SQL语句时,需要使用INNER JOIN关联goods_spec表查询规格项。

2.4 SKU商品下单实现

在用户购买SKU商品时,需要将所选的规格信息传递给后台进行下单,接下来是一个简单的下单实现示例。

$goodsId = 1; // 商品ID

$specs = [

['spec_id' => 1, 'spec_item_id' => 2], // 颜色:黑色

['spec_id' => 2, 'spec_item_id' => 5] // 尺寸:S

];

// 插入订单信息

$sql = 'INSERT INTO order (goods_id, price) VALUES (:goods_id, :price)';

$stmt = $pdo->prepare($sql);

$stmt->bindParam(':goods_id', $goodsId, PDO::PARAM_INT);

$stmt->bindParam(':price', $skuPrice, PDO::PARAM_STR);

$stmt->execute();

$orderId = $pdo->lastInsertId();

// 插入订单规格信息

foreach ($specs as $spec) {

$sql = 'INSERT INTO order_spec (order_id, spec_id, spec_item_id) VALUES (:order_id, :spec_id, :spec_item_id)';

$stmt = $pdo->prepare($sql);

$stmt->bindParam(':order_id', $orderId, PDO::PARAM_INT);

$stmt->bindParam(':spec_id', $spec['spec_id'], PDO::PARAM_INT);

$stmt->bindParam(':spec_item_id', $spec['spec_item_id'], PDO::PARAM_INT);

$stmt->execute();

}

这段代码在插入订单信息之后,也同样插入了订单规格信息,以便于后续的查询和管理。

3. 总结

本文介绍了如何通过商品规格SKU实现商品多样性的展示和管理,其实现思路主要包括数据库表设计、SKU商品展示页面设计、SKU商品查询实现和SKU商品下单实现等步骤。通过这些步骤,我们可以实现在电商网站中常见的商品多规格SKU功能,提供给用户更好的购买体验,以及更加灵活和方便的管理和统计方式。

后端开发标签