php实现sku
PHP实现SKU功能
SKU(Stock Keeping Unit)是库存管理中的最小单位,通常用于唯一标识商品的不同属性组合。在PHP中实现SKU功能需要考虑商品属性组合、唯一性生成以及数据库存储等方面。
生成SKU编码
SKU通常由商品ID、属性ID等组合生成,确保唯一性:
function generateSku($productId, $attributeIds) {
$attributePart = implode('-', $attributeIds);
return 'SKU-' . $productId . '-' . $attributePart;
}
数据库设计
需要设计合理的数据库表结构来存储SKU信息:
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
description TEXT
);
CREATE TABLE attributes (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL
);
CREATE TABLE product_attributes (
product_id INT,
attribute_id INT,
value VARCHAR(100),
PRIMARY KEY (product_id, attribute_id),
FOREIGN KEY (product_id) REFERENCES products(id),
FOREIGN KEY (attribute_id) REFERENCES attributes(id)
);
CREATE TABLE skus (
id INT PRIMARY KEY AUTO_INCREMENT,
product_id INT,
sku_code VARCHAR(100) UNIQUE,
price DECIMAL(10,2),
stock INT,
FOREIGN KEY (product_id) REFERENCES products(id)
);
处理多属性组合
对于多属性商品,需要生成所有可能的属性组合:
function generateAllSkuCombinations($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) {
$attributeIds = array_values($combination);
$skus[] = generateSku($productId, $attributeIds);
}
return $skus;
}
前端展示与选择
在前端展示SKU选择界面,通常使用JavaScript实现属性联动选择:
<div class="product-attributes">
<div class="attribute" v-for="attribute in attributes">
<h3>{{ attribute.name }}</h3>
<div class="attribute-values">
<span v-for="value in attribute.values"
@click="selectAttribute(attribute.id, value.id)"
:class="{selected: isSelected(attribute.id, value.id)}">
{{ value.name }}
</span>
</div>
</div>
</div>
库存验证
在用户选择属性组合后,需要验证对应SKU的库存:
function checkSkuStock($productId, $selectedAttributes) {
$skuCode = generateSku($productId, array_values($selectedAttributes));
$stmt = $pdo->prepare("SELECT stock FROM skus WHERE sku_code = ?");
$stmt->execute([$skuCode]);
$sku = $stmt->fetch();
return $sku ? $sku['stock'] : 0;
}
购物车处理
将选中的SKU加入购物车时,需要存储完整的SKU信息:
function addToCart($userId, $skuCode, $quantity) {
$stmt = $pdo->prepare("INSERT INTO cart_items (user_id, sku_code, quantity)
VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE quantity = quantity + VALUES(quantity)");
$stmt->execute([$userId, $skuCode, $quantity]);
}
性能优化
对于大型电商系统,SKU数量可能非常庞大,需要考虑性能优化:
- 为sku_code字段添加索引
- 使用缓存存储热门SKU信息
- 考虑分表存储不同类别的SKU
- 实现异步SKU生成机制
完整示例
一个简单的SKU生成和管理类示例:
class SkuManager {
private $pdo;
public function __construct(PDO $pdo) {
$this->pdo = $pdo;
}
public function createProductSkus($productId, $attributes) {
$combinations = $this->generateAttributeCombinations($attributes);
foreach ($combinations as $combination) {
$skuCode = $this->generateSkuCode($productId, $combination);
$price = $this->calculateSkuPrice($productId, $combination);
$stmt = $this->pdo->prepare("INSERT INTO skus (product_id, sku_code, price, stock)
VALUES (?, ?, ?, 0)");
$stmt->execute([$productId, $skuCode, $price]);
}
}
private function generateAttributeCombinations($attributes) {
// 实现属性组合生成逻辑
}
private function generateSkuCode($productId, $attributeIds) {
sort($attributeIds);
return 'SKU-' . $productId . '-' . implode('-', $attributeIds);
}
private function calculateSkuPrice($productId, $attributeIds) {
// 实现基于属性的价格计算逻辑
}
}
以上代码和方案提供了一个完整的PHP实现SKU功能的框架,可以根据实际需求进行调整和扩展。







