php 实现sku
PHP实现SKU系统的方法
SKU(Stock Keeping Unit)是库存管理中的最小单元,通常由商品属性组合生成唯一标识。以下是PHP实现SKU的常见方法:
生成SKU编码
使用商品属性组合生成唯一SKU。假设商品有颜色、尺寸两个属性:
function generateSku($productId, $color, $size) {
$prefix = 'ITEM'; // 可选前缀
$colorCode = strtoupper(substr($color, 0, 2));
$sizeCode = str_pad($size, 2, '0', STR_PAD_LEFT);
return $prefix . '-' . $productId . '-' . $colorCode . $sizeCode;
}
数据库设计
典型SKU相关表结构设计:

CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
description TEXT
);
CREATE TABLE product_attributes (
id INT AUTO_INCREMENT PRIMARY KEY,
product_id INT,
name VARCHAR(100),
FOREIGN KEY (product_id) REFERENCES products(id)
);
CREATE TABLE skus (
id INT AUTO_INCREMENT PRIMARY KEY,
product_id INT,
sku_code VARCHAR(50) UNIQUE,
price DECIMAL(10,2),
stock INT,
FOREIGN KEY (product_id) REFERENCES products(id)
);
CREATE TABLE sku_attribute_values (
sku_id INT,
attribute_id INT,
value VARCHAR(100),
PRIMARY KEY (sku_id, attribute_id),
FOREIGN KEY (sku_id) REFERENCES skus(id),
FOREIGN KEY (attribute_id) REFERENCES product_attributes(id)
);
处理多属性组合
动态生成所有可能的SKU组合:
function generateAllSkus($productId, $attributes) {
$combinations = [[]];
foreach ($attributes as $attribute => $values) {
$temp = [];
foreach ($combinations as $combination) {
foreach ($values as $value) {
$temp[] = $combination + [$attribute => $value];
}
}
$combinations = $temp;
}
$skus = [];
foreach ($combinations as $combination) {
$skuParts = [];
foreach ($combination as $attr => $value) {
$skuParts[] = substr($attr, 0, 1) . substr($value, 0, 2);
}
$skus[] = [
'code' => 'PROD' . $productId . '-' . implode('', $skuParts),
'attributes' => $combination
];
}
return $skus;
}
SKU查询与验证
检查SKU唯一性并查询:

function isSkuUnique($skuCode, $excludeId = null) {
$query = "SELECT COUNT(*) FROM skus WHERE sku_code = :sku";
$params = [':sku' => $skuCode];
if ($excludeId) {
$query .= " AND id != :id";
$params[':id'] = $excludeId;
}
$stmt = $pdo->prepare($query);
$stmt->execute($params);
return $stmt->fetchColumn() == 0;
}
function getSkuByAttributes($productId, $attributes) {
// 实现根据属性组合查询SKU的逻辑
}
实际应用示例
电商系统中的SKU应用:
// 添加新产品SKU
function addProductSku($productId, $skuData, $attributes) {
if (!isSkuUnique($skuData['code'])) {
throw new Exception('SKU已存在');
}
$pdo->beginTransaction();
try {
$stmt = $pdo->prepare("INSERT INTO skus (product_id, sku_code, price, stock) VALUES (?, ?, ?, ?)");
$stmt->execute([$productId, $skuData['code'], $skuData['price'], $skuData['stock']]);
$skuId = $pdo->lastInsertId();
foreach ($attributes as $attrId => $value) {
$stmt = $pdo->prepare("INSERT INTO sku_attribute_values (sku_id, attribute_id, value) VALUES (?, ?, ?)");
$stmt->execute([$skuId, $attrId, $value]);
}
$pdo->commit();
return $skuId;
} catch (Exception $e) {
$pdo->rollBack();
throw $e;
}
}
性能优化建议
对于大型电商系统,SKU实现应考虑:
- 使用缓存存储热门SKU信息
- 批量生成SKU时采用批量插入优化
- 为sku_code字段添加唯一索引
- 考虑使用Redis等内存数据库加速SKU查询
以上方法提供了PHP实现SKU系统的基础框架,可根据具体业务需求进行调整和扩展。






