php 实现sku
PHP实现SKU功能
SKU(Stock Keeping Unit)是库存管理中的关键概念,用于唯一标识商品的不同属性组合。在电商系统中,实现SKU功能需要考虑属性组合、库存管理和价格计算等核心要素。
数据库设计
创建商品表、属性表和SKU表是基础结构:
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT
);
CREATE TABLE attributes (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE attribute_values (
id INT AUTO_INCREMENT PRIMARY KEY,
attribute_id INT NOT NULL,
value VARCHAR(100) NOT NULL,
FOREIGN KEY (attribute_id) REFERENCES attributes(id)
);
CREATE TABLE skus (
id INT AUTO_INCREMENT PRIMARY KEY,
product_id INT NOT NULL,
sku_code VARCHAR(50) UNIQUE NOT NULL,
price DECIMAL(10,2) NOT NULL,
stock INT NOT NULL DEFAULT 0,
FOREIGN KEY (product_id) REFERENCES products(id)
);
CREATE TABLE sku_attribute_values (
sku_id INT NOT NULL,
attribute_value_id INT NOT NULL,
PRIMARY KEY (sku_id, attribute_value_id),
FOREIGN KEY (sku_id) REFERENCES skus(id),
FOREIGN KEY (attribute_value_id) REFERENCES attribute_values(id)
);
生成SKU组合
使用递归方法生成所有可能的属性组合:

function generateCombinations($arrays, $i = 0) {
if (!isset($arrays[$i])) {
return array();
}
if ($i == count($arrays) - 1) {
return $arrays[$i];
}
$result = array();
foreach ($arrays[$i] as $element) {
foreach (generateCombinations($arrays, $i + 1) as $combination) {
$result[] = array_merge(array($element), (array)$combination);
}
}
return $result;
}
$colorOptions = ['红', '蓝', '绿'];
$sizeOptions = ['S', 'M', 'L'];
$combinations = generateCombinations([$colorOptions, $sizeOptions]);
SKU编码生成
根据属性组合生成唯一SKU编码:
function generateSkuCode($productId, $attributes) {
$hash = md5($productId . implode('', $attributes));
return substr(strtoupper($hash), 0, 8);
}
$productId = 123;
$skuCode = generateSkuCode($productId, ['红', 'M']);
数据库操作类
封装SKU相关的数据库操作:

class SkuManager {
private $db;
public function __construct($dbConnection) {
$this->db = $dbConnection;
}
public function createSku($productId, $attributes, $price, $stock) {
$skuCode = $this->generateSkuCode($productId, $attributes);
$stmt = $this->db->prepare("INSERT INTO skus (product_id, sku_code, price, stock) VALUES (?, ?, ?, ?)");
$stmt->execute([$productId, $skuCode, $price, $stock]);
$skuId = $this->db->lastInsertId();
foreach ($attributes as $attrValueId) {
$stmt = $this->db->prepare("INSERT INTO sku_attribute_values (sku_id, attribute_value_id) VALUES (?, ?)");
$stmt->execute([$skuId, $attrValueId]);
}
return $skuId;
}
public function getSkusByProduct($productId) {
$stmt = $this->db->prepare("
SELECT s.*, GROUP_CONCAT(av.value SEPARATOR ', ') AS attributes
FROM skus s
JOIN sku_attribute_values sav ON s.id = sav.sku_id
JOIN attribute_values av ON sav.attribute_value_id = av.id
WHERE s.product_id = ?
GROUP BY s.id
");
$stmt->execute([$productId]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
前端交互处理
接收前端提交的SKU数据并处理:
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$productId = $_POST['product_id'];
$skusData = json_decode($_POST['skus'], true);
$skuManager = new SkuManager($db);
foreach ($skusData as $sku) {
$skuManager->createSku(
$productId,
$sku['attributes'],
$sku['price'],
$sku['stock']
);
}
header('Content-Type: application/json');
echo json_encode(['success' => true]);
exit;
}
库存更新方法
实现SKU库存的增减操作:
public function updateStock($skuId, $quantity, $operation = 'add') {
$operator = $operation === 'add' ? '+' : '-';
$stmt = $this->db->prepare("UPDATE skus SET stock = stock $operator ? WHERE id = ?");
return $stmt->execute([$quantity, $skuId]);
}
价格计算策略
根据不同的业务需求实现价格计算:
public function calculatePrice($skuId, $quantity, $discountRules = []) {
$stmt = $this->db->prepare("SELECT price FROM skus WHERE id = ?");
$stmt->execute([$skuId]);
$basePrice = $stmt->fetchColumn();
$finalPrice = $basePrice;
foreach ($discountRules as $rule) {
if ($quantity >= $rule['min_quantity']) {
$finalPrice = $basePrice * (1 - $rule['discount']);
break;
}
}
return $finalPrice * $quantity;
}
注意事项
- 确保SKU编码的唯一性,避免重复
- 处理属性组合时需要验证有效性
- 库存操作需要添加事务处理保证数据一致性
- 考虑性能问题,特别是当属性组合较多时
- 实现适当的缓存机制减少数据库查询
通过以上方法可以实现完整的SKU管理系统,包括生成、存储、查询和更新等核心功能。实际应用中可根据具体需求进行调整和扩展。





