thinkphp 5.1 购物车要合并重复商品,先给 user_id 和 sku_id 建联合唯一键,再用 mysql 的原子插入或累加语句。相同用户重复加入同一规格时,数据库保留一行。
先建立用户与 SKU 的唯一约束
以下为新建练习表的示例。已有表先检查和合并重复记录,再加唯一索引。
CREATE TABLE cart_items (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT UNSIGNED NOT NULL,
sku_id BIGINT UNSIGNED NOT NULL,
quantity INT UNSIGNED NOT NULL,
UNIQUE KEY cart_user_sku (user_id, sku_id)
) ENGINE=InnoDB;

sku_id 应标识具体规格。不同颜色或尺寸的 SKU 分开计数。
用一条 SQL 插入或增加数量
在已认证且通过 CSRF 检查的 POST 处理流程里,验证 SKU 可售和数量为允许的正整数。把服务端识别的用户 ID 传给下面的代码。
$sql = 'INSERT INTO cart_items (user_id, sku_id, quantity)
VALUES (:user_id, :sku_id, :initial_quantity)
ON DUPLICATE KEY UPDATE quantity = quantity + :extra_quantity';
\think\Db::execute($sql, [
'user_id' => $authenticatedUserId,
'sku_id' => $skuId,
'initial_quantity' => $quantity,
'extra_quantity' => $quantity,
]);

SQL 使用实际表名。若项目配置了表前缀,固定写入部署使用的表名。业务若限制累计数量,也要在同一次更新中落实该上限。
检查重复加入后的行数和数量
用测试用户 1 对 SKU 42 先加入 2 件,再加入 3 件。
SELECT COUNT(*) AS item_rows, SUM(quantity) AS total_quantity FROM cart_items WHERE user_id = 1 AND sku_id = 42;
预期 item_rows 为 1,total_quantity 为 5。购物车数量用于记录购买意向,结算时仍需校验库存。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











