php sku实现
PHP SKU 实现方案
SKU(Stock Keeping Unit)是库存管理中的唯一标识符,通常用于区分商品的不同属性组合(如颜色、尺寸等)。以下是几种常见的 PHP 实现方案:
方案一:基于数据库的 SKU 生成
创建商品表和 SKU 关联表,通过数据库关联实现 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,
attribute_name VARCHAR(100),
attribute_value VARCHAR(100)
);
CREATE TABLE skus (
id INT AUTO_INCREMENT PRIMARY KEY,
product_id INT,
sku_code VARCHAR(50) UNIQUE,
price DECIMAL(10,2),
stock INT
);
生成 SKU 的 PHP 代码示例:
function generateSku($productId, $attributes) {
$skuBase = 'PROD-' . str_pad($productId, 5, '0', STR_PAD_LEFT);
$attributePart = '';
foreach ($attributes as $attr) {
$attributePart .= substr($attr['name'], 0, 1) . substr($attr['value'], 0, 2);
}
return $skuBase . '-' . strtoupper($attributePart);
}
方案二:使用组合模式生成 SKU
对于具有多属性的商品,可以采用组合模式生成 SKU:
class Product {
protected $id;
protected $name;
protected $variants = [];
public function addVariant($attributes) {
$variant = new ProductVariant($this, $attributes);
$this->variants[] = $variant;
return $variant;
}
}
class ProductVariant {
protected $product;
protected $attributes;
protected $sku;
public function __construct($product, $attributes) {
$this->product = $product;
$this->attributes = $attributes;
$this->generateSku();
}
protected function generateSku() {
$skuParts = ['PROD', $this->product->getId()];
foreach ($this->attributes as $attr) {
$skuParts[] = substr($attr['name'], 0, 1) . substr($attr['value'], 0, 2);
}
$this->sku = implode('-', $skuParts);
}
}
方案三:使用 Laravel 实现 SKU 系统
在 Laravel 框架中,可以使用模型关系实现 SKU 管理:
// Product 模型
class Product extends Model {
public function variants() {
return $this->hasMany(ProductVariant::class);
}
}
// ProductVariant 模型
class ProductVariant extends Model {
protected $fillable = ['sku', 'price', 'stock'];
public static function boot() {
parent::boot();
static::creating(function ($variant) {
if (empty($variant->sku)) {
$variant->sku = $variant->generateSku();
}
});
}
public function generateSku() {
$base = 'PROD-' . str_pad($this->product_id, 5, '0', STR_PAD_LEFT);
$attributes = $this->attributes->pluck('value')->implode('-');
return $base . '-' . strtoupper($attributes);
}
}
方案四:使用 Redis 缓存 SKU 信息
对于高并发的 SKU 查询,可以使用 Redis 缓存:
function getSkuInfo($skuCode) {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$cacheKey = 'sku:' . $skuCode;
$skuInfo = $redis->get($cacheKey);
if (!$skuInfo) {
$skuInfo = DB::table('skus')->where('sku_code', $skuCode)->first();
$redis->setex($cacheKey, 3600, json_encode($skuInfo));
} else {
$skuInfo = json_decode($skuInfo);
}
return $skuInfo;
}
方案五:SKU 批量生成与导入
对于需要批量生成 SKU 的场景:
function batchGenerateSkus($products) {
$generated = [];
foreach ($products as $product) {
$variants = $product['variants'];
foreach ($variants as $variant) {
$sku = generateSku($product['id'], $variant['attributes']);
$generated[] = [
'product_id' => $product['id'],
'sku_code' => $sku,
'attributes' => json_encode($variant['attributes']),
'price' => $variant['price'],
'stock' => $variant['stock']
];
}
}
DB::table('skus')->insert($generated);
return count($generated);
}
注意事项
SKU 生成时应考虑以下因素:

- 确保 SKU 的唯一性
- 保持 SKU 的可读性和可识别性
- 考虑未来扩展性
- 避免使用特殊字符
- 考虑不同系统和平台的兼容性
对于大型电商系统,建议将 SKU 生成逻辑封装为单独的服务,便于统一管理和维护。






