《PHP商城开发中如何处理SKU商品的增、删、改、查》
在电商系统的开发中,SKU(Stock Keeping Unit,库存量单位)管理是核心功能之一。它通过组合商品属性(如颜色、尺寸、版本等)生成唯一标识,帮助商家精准管理库存、定价和销售策略。本文将围绕PHP商城开发中SKU商品的增、删、改、查(CRUD)操作展开,从数据库设计到业务逻辑实现,结合代码示例详细讲解。
一、SKU管理的核心概念
SKU的本质是商品属性的组合。例如,一件T恤可能有“颜色:红色、尺寸:M”和“颜色:蓝色、尺寸:L”两种SKU,对应不同的库存和价格。在数据库中,SKU通常以主表(商品基本信息)和子表(SKU属性及库存)的形式存储。
二、数据库设计
合理的数据库设计是SKU管理的基础。以下是一个典型的表结构示例:
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` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2. SKU属性表(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_values` text COMMENT '属性值(JSON数组)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. SKU表(skus)
存储具体的SKU信息,包括属性组合、库存、价格等。
CREATE TABLE `skus` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`product_id` int(11) NOT NULL COMMENT '商品ID',
`sku_code` varchar(50) NOT NULL COMMENT 'SKU编码',
`attributes` text NOT NULL COMMENT '属性组合(JSON)',
`price` decimal(10,2) NOT NULL COMMENT 'SKU价格',
`stock` int(11) NOT NULL DEFAULT '0' COMMENT '库存',
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `sku_code` (`sku_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
三、SKU的增删改查实现
1. 添加SKU(Create)
添加SKU时需处理属性组合并生成唯一SKU编码。示例代码如下:
class SkuService {
public function addSku($productId, $attributes, $price, $stock) {
// 生成SKU编码(示例:商品ID+属性哈希)
$attributeHash = md5(json_encode($attributes));
$skuCode = 'SKU_' . $productId . '_' . $attributeHash;
// 检查SKU是否已存在
$existingSku = $this->getSkuByCode($skuCode);
if ($existingSku) {
throw new Exception('SKU已存在');
}
// 插入SKU数据
$db = new PDO('mysql:host=localhost;dbname=mall', 'user', 'pass');
$stmt = $db->prepare("INSERT INTO skus (product_id, sku_code, attributes, price, stock, created_at) VALUES (?, ?, ?, ?, ?, NOW())");
$stmt->execute([
$productId,
$skuCode,
json_encode($attributes),
$price,
$stock
]);
return $db->lastInsertId();
}
private function getSkuByCode($skuCode) {
$db = new PDO('mysql:host=localhost;dbname=mall', 'user', 'pass');
$stmt = $db->prepare("SELECT * FROM skus WHERE sku_code = ?");
$stmt->execute([$skuCode]);
return $stmt->fetch(PDO::FETCH_ASSOC);
}
}
2. 查询SKU(Read)
查询SKU通常包括按商品ID获取所有SKU、按属性筛选SKU等场景。
class SkuService {
// 按商品ID获取所有SKU
public function getSkusByProductId($productId) {
$db = new PDO('mysql:host=localhost;dbname=mall', 'user', 'pass');
$stmt = $db->prepare("SELECT * FROM skus WHERE product_id = ? ORDER BY created_at DESC");
$stmt->execute([$productId]);
$skus = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 解析JSON属性
foreach ($skus as &$sku) {
$sku['attributes'] = json_decode($sku['attributes'], true);
}
return $skus;
}
// 按属性筛选SKU(示例:查询红色M码的T恤)
public function getSkusByAttributes($productId, $filters) {
$db = new PDO('mysql:host=localhost;dbname=mall', 'user', 'pass');
$skus = [];
$allSkus = $this->getSkusByProductId($productId);
foreach ($allSkus as $sku) {
$attributes = $sku['attributes'];
$match = true;
foreach ($filters as $key => $value) {
if (!isset($attributes[$key]) || $attributes[$key] != $value) {
$match = false;
break;
}
}
if ($match) {
$skus[] = $sku;
}
}
return $skus;
}
}
3. 更新SKU(Update)
更新SKU时需注意并发控制和数据一致性。
class SkuService {
public function updateSku($skuId, $price, $stock) {
$db = new PDO('mysql:host=localhost;dbname=mall', 'user', 'pass');
$stmt = $db->prepare("UPDATE skus SET price = ?, stock = ?, updated_at = NOW() WHERE id = ?");
$affected = $stmt->execute([$price, $stock, $skuId]);
if ($affected === false) {
throw new Exception('更新失败');
}
return true;
}
// 批量更新库存(减库存示例)
public function reduceStock($skuId, $quantity) {
$db = new PDO('mysql:host=localhost;dbname=mall', 'user', 'pass');
$db->beginTransaction();
try {
$stmt = $db->prepare("UPDATE skus SET stock = stock - ? WHERE id = ? AND stock >= ?");
$affected = $stmt->execute([$quantity, $skuId, $quantity]);
if ($affected === false || $stmt->rowCount() === 0) {
$db->rollBack();
throw new Exception('库存不足或更新失败');
}
$db->commit();
return true;
} catch (Exception $e) {
$db->rollBack();
throw $e;
}
}
}
4. 删除SKU(Delete)
删除SKU需检查关联数据(如订单、促销活动)。
class SkuService {
public function deleteSku($skuId) {
// 检查是否有关联订单(伪代码)
$orderItems = $this->getOrderItemsBySkuId($skuId);
if (!empty($orderItems)) {
throw new Exception('该SKU存在关联订单,无法删除');
}
$db = new PDO('mysql:host=localhost;dbname=mall', 'user', 'pass');
$stmt = $db->prepare("DELETE FROM skus WHERE id = ?");
$affected = $stmt->execute([$skuId]);
if ($affected === false) {
throw new Exception('删除失败');
}
return true;
}
private function getOrderItemsBySkuId($skuId) {
// 实际开发中需查询订单表
return [];
}
}
四、高级功能扩展
1. 属性模板管理
为减少重复操作,可设计属性模板。例如,所有T恤共享“颜色、尺寸”属性模板。
CREATE TABLE `attribute_templates` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL COMMENT '模板名称',
`attributes` text NOT NULL COMMENT '属性列表(JSON)',
PRIMARY KEY (`id`)
);
2. 动态表单生成
根据属性模板动态生成前端表单,提升用户体验。
class AttributeService {
public function getTemplateAttributes($templateId) {
$db = new PDO('mysql:host=localhost;dbname=mall', 'user', 'pass');
$stmt = $db->prepare("SELECT attributes FROM attribute_templates WHERE id = ?");
$stmt->execute([$templateId]);
$template = $stmt->fetch(PDO::FETCH_ASSOC);
return json_decode($template['attributes'], true) ?: [];
}
}
3. 库存预警
通过定时任务检查低库存SKU并发送通知。
class StockAlertService {
public function checkLowStock() {
$db = new PDO('mysql:host=localhost;dbname=mall', 'user', 'pass');
$stmt = $db->prepare("SELECT * FROM skus WHERE stock execute([10]); // 预警阈值
$lowStockSkus = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($lowStockSkus as $sku) {
$this->sendAlert($sku);
}
}
private function sendAlert($sku) {
// 发送邮件或短信逻辑
}
}
五、性能优化建议
1. 数据库索引优化:为`product_id`、`sku_code`等字段添加索引。
2. 缓存策略:使用Redis缓存热门SKU数据。
3. 批量操作:支持批量更新库存(如`UPDATE skus SET stock = stock - 1 WHERE id IN (1,2,3)`)。
4. 异步处理:高并发场景下使用消息队列(如RabbitMQ)处理库存变更。
六、安全注意事项
1. 参数校验:防止SQL注入(使用PDO预处理语句)。
2. 权限控制:确保只有管理员可操作SKU。
3. 数据备份:定期备份SKU数据,防止误删除。
关键词:PHP商城开发、SKU管理、数据库设计、CRUD操作、属性组合、库存预警、性能优化
简介:本文详细讲解PHP商城开发中SKU商品的增删改查实现,涵盖数据库设计、核心代码示例、高级功能扩展及性能优化建议,帮助开发者构建高效稳定的SKU管理系统。