《PHP商城开发中常用的SKU管理功能代码示例整理》
在电商系统开发中,SKU(Stock Keeping Unit)管理是商品管理的核心功能之一。它通过唯一标识商品的不同属性组合(如颜色、尺寸、规格等),实现库存精准控制、价格差异化管理和订单处理优化。本文将围绕PHP商城开发中的SKU管理功能,从数据库设计、核心功能实现到前端交互,提供完整的代码示例和实现思路。
一、SKU管理的基础概念
SKU是电商系统中对商品属性的最小可售单元的标识。例如,一件T恤可能有“红色-S码”“蓝色-M码”等不同SKU,每个SKU对应独立的库存、价格和条形码。SKU管理的核心目标包括:
- 实现商品属性的组合管理
- 支持动态价格和库存更新
- 优化订单处理和库存预警
二、数据库设计
SKU管理需要设计三张核心表:商品表(products
)、属性表(product_attributes
)和SKU表(product_skus
)。
1. 商品表(products)
CREATE TABLE `products` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL COMMENT '商品名称',
`category_id` int(11) NOT NULL COMMENT '分类ID',
`base_price` decimal(10,2) NOT NULL COMMENT '基础价格',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2. 属性表(product_attributes)
CREATE TABLE `product_attributes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`product_id` int(11) NOT NULL COMMENT '商品ID',
`attribute_name` varchar(50) NOT NULL COMMENT '属性名(如颜色)',
`attribute_value` varchar(50) NOT NULL COMMENT '属性值(如红色)',
PRIMARY KEY (`id`),
KEY `product_id` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. SKU表(product_skus)
CREATE TABLE `product_skus` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`product_id` int(11) NOT NULL COMMENT '商品ID',
`sku_code` varchar(20) NOT NULL COMMENT 'SKU编码',
`attributes` json NOT NULL COMMENT '属性组合(JSON格式)',
`price` decimal(10,2) NOT NULL COMMENT 'SKU价格',
`stock` int(11) NOT NULL DEFAULT '0' COMMENT '库存',
`barcode` varchar(20) DEFAULT NULL COMMENT '条形码',
PRIMARY KEY (`id`),
UNIQUE KEY `sku_code` (`sku_code`),
KEY `product_id` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
三、核心功能实现
1. SKU生成与存储
SKU编码通常由商品ID和属性值组合生成。以下是一个生成SKU的示例函数:
function generateSkuCode($productId, $attributes) {
$attributeKeys = array_keys($attributes);
sort($attributeKeys); // 确保属性顺序一致
$attributeString = implode('-', $attributeKeys) . ':' . implode('-', $attributes);
return 'SKU-' . $productId . '-' . md5($attributeString); // 使用MD5简化唯一标识
}
存储SKU的完整示例:
function addSku($productId, $attributes, $price, $stock) {
$skuCode = generateSkuCode($productId, $attributes);
$attributeJson = json_encode($attributes);
$db = new PDO('mysql:host=localhost;dbname=ecommerce', 'user', 'password');
$stmt = $db->prepare("INSERT INTO product_skus
(product_id, sku_code, attributes, price, stock)
VALUES (?, ?, ?, ?, ?)");
$stmt->execute([$productId, $skuCode, $attributeJson, $price, $stock]);
return $db->lastInsertId();
}
2. SKU查询与过滤
根据属性过滤SKU的示例:
function getSkusByAttributes($productId, $filterAttributes) {
$db = new PDO('mysql:host=localhost;dbname=ecommerce', 'user', 'password');
// 构建JSON查询条件(简化示例)
$conditions = [];
foreach ($filterAttributes as $key => $value) {
$conditions[] = "JSON_EXTRACT(attributes, '$.$key') = '$value'";
}
$whereClause = implode(' AND ', $conditions);
$stmt = $db->prepare("SELECT * FROM product_skus
WHERE product_id = ? AND $whereClause");
$stmt->execute([$productId]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
3. 库存更新与预警
库存更新需要原子性操作,避免并发问题:
function updateStock($skuId, $quantity) {
$db = new PDO('mysql:host=localhost;dbname=ecommerce', 'user', 'password');
$db->beginTransaction();
try {
$stmt = $db->prepare("UPDATE product_skus SET stock = stock + ? WHERE id = ?");
$stmt->execute([$quantity, $skuId]);
// 检查库存是否低于阈值
$stmt = $db->prepare("SELECT stock FROM product_skus WHERE id = ?");
$stmt->execute([$skuId]);
$currentStock = $stmt->fetchColumn();
if ($currentStock commit();
return true;
} catch (Exception $e) {
$db->rollBack();
return false;
}
}
4. 前端交互示例(Vue.js)
前端展示SKU选择器的Vue组件示例:
价格: {{ currentSku.price }} | 库存: {{ currentSku.stock }}
四、高级功能扩展
1. 批量导入SKU
通过CSV文件批量导入SKU的示例:
function importSkusFromCsv($filePath, $productId) {
$db = new PDO('mysql:host=localhost;dbname=ecommerce', 'user', 'password');
$db->beginTransaction();
try {
$csv = array_map('str_getcsv', file($filePath));
$headers = array_shift($csv);
foreach ($csv as $row) {
$attributes = [];
for ($i = 0; $i prepare("INSERT INTO product_skus
(product_id, sku_code, attributes, price, stock)
VALUES (?, ?, ?, ?, ?)");
$stmt->execute([
$productId,
generateSkuCode($productId, $attributes),
json_encode($attributes),
$row[count($headers) - 3],
$row[count($headers) - 2]
]);
}
$db->commit();
return true;
} catch (Exception $e) {
$db->rollBack();
return false;
}
}
2. SKU组合价格计算
根据基础价格和属性加成计算SKU价格的示例:
function calculateSkuPrice($productId, $attributes) {
$db = new PDO('mysql:host=localhost;dbname=ecommerce', 'user', 'password');
// 获取基础价格
$stmt = $db->prepare("SELECT base_price FROM products WHERE id = ?");
$stmt->execute([$productId]);
$basePrice = $stmt->fetchColumn();
// 计算属性加成(示例:红色加价10元)
$priceIncrement = 0;
if (isset($attributes['颜色']) && $attributes['颜色'] === '红色') {
$priceIncrement += 10;
}
return $basePrice + $priceIncrement;
}
五、性能优化建议
1. 数据库索引优化:为product_skus
表的product_id
和sku_code
字段添加索引
2. 缓存策略:使用Redis缓存热门商品的SKU数据
3. 批量操作:使用预处理语句和事务减少数据库开销
4. 异步处理:将库存预警等非实时操作放入消息队列
六、完整示例:SKU管理控制器
class SkuController {
private $db;
public function __construct() {
$this->db = new PDO('mysql:host=localhost;dbname=ecommerce', 'user', 'password');
}
// 添加SKU
public function addSku($productId, $attributes, $price, $stock) {
$skuCode = $this->generateSkuCode($productId, $attributes);
$attributeJson = json_encode($attributes);
$stmt = $this->db->prepare("INSERT INTO product_skus
(product_id, sku_code, attributes, price, stock)
VALUES (?, ?, ?, ?, ?)");
$stmt->execute([$productId, $skuCode, $attributeJson, $price, $stock]);
return $this->db->lastInsertId();
}
// 查询SKU
public function getSku($skuId) {
$stmt = $this->db->prepare("SELECT * FROM product_skus WHERE id = ?");
$stmt->execute([$skuId]);
return $stmt->fetch(PDO::FETCH_ASSOC);
}
// 更新库存
public function updateStock($skuId, $quantity) {
$this->db->beginTransaction();
try {
$stmt = $this->db->prepare("UPDATE product_skus SET stock = stock + ? WHERE id = ?");
$stmt->execute([$quantity, $skuId]);
$stmt = $this->db->prepare("SELECT stock FROM product_skus WHERE id = ?");
$stmt->execute([$skuId]);
$currentStock = $stmt->fetchColumn();
if ($currentStock triggerStockAlert($skuId, $currentStock);
}
$this->db->commit();
return true;
} catch (Exception $e) {
$this->db->rollBack();
return false;
}
}
private function generateSkuCode($productId, $attributes) {
$attributeKeys = array_keys($attributes);
sort($attributeKeys);
$attributeString = implode('-', $attributeKeys) . ':' . implode('-', $attributes);
return 'SKU-' . $productId . '-' . md5($attributeString);
}
private function triggerStockAlert($skuId, $stock) {
// 实现库存预警逻辑(如发送邮件)
}
}
关键词
PHP商城开发、SKU管理、数据库设计、库存控制、价格计算、批量导入、前端交互、性能优化
简介
本文详细介绍了PHP商城开发中SKU管理的完整实现方案,包括数据库设计、核心功能代码(生成/查询/更新SKU)、前端交互示例和高级功能扩展。通过实际代码示例展示了如何实现动态属性组合、库存预警和批量操作,同时提供了性能优化建议,适合中高级PHP开发者参考。