我有一个购物车作为一个名为cart
的DB表,它存储每个SaaS实例购物车中的商品记录。我想做的是,如果一个产品被添加到一个用户的购物车中,并且已经存在一个相同的记录,则更新表中的数量列,使其等于旧值加上新值,只有当status = 0时,否则,输入一个新记录。
如果商品已经在购物车中,则更新数量列以设置新的数量值;如果状态列= 0,则将该商品作为新行添加到购物车表中。
这是我目前为止的内容:
$itemList = $db->query("INSERT INTO
cart(
`lmsid`,
`userid`,
`courseid`,
`assigned_by`,
`assigned_on`,
`quantity`)
VALUES(
:lmsid,
:userid,
:courseid,
:assigned_by,
:assigned_on,
1)
ON DUPLICATE KEY UPDATE
`quantity` = `quantity` + values('quantity')
)",
array(
"lmsid"=>$core['id'],
"userid"=>$user,
"courseid"=>$_POST['courseid'],
"assigned_by"=>$userInfo['id'],
"assigned_on"=>time())
);
目前…
- 如果一个记录根本不存在,它会被完美地插入。
- 如果存在状态= 0的记录,则表示现有数量已完全更新。
- 如果存在status = 2的记录,查询失败:
Unhandled Exception. SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '66-2' for key 'useridAndCourseid'
表中键useridAndCourseid
为:
UNIQUE KEY `useridAndCourseid` (`userid`,`courseid`)
当产品从购物车中删除时,状态列更新为'1',该记录将永远保留在我们的记录中。当产品已经付款时,状态更新为'2',同样,对于我们的记录。当一条记录只是在购物车中等待处理时,它的状态为0。
我需要什么帮助
目前查询是一半的工作,但我只是不知道如何说'如果记录存在并且状态= 0更新数量,否则,插入新记录'。这就是我想要达到的目标,但是我想我把它弄得太复杂了,或者我花了很长时间把它弄得太复杂了,我忘了我想要的是什么!我相信有一个简单的解决办法。如果我能使用ON DUPLICATE KEY和WHERE子句就好了…
谢谢你的帮助!
有多种方法可以做到这一点。但是,如果您想要insert
的单个语句,则需要创建一个惟一的索引来执行您想要的操作。这个索引应该有一个列,当status = 0
和NULL
在其他时间出现时,该列取某个值(比如0
)。NULL
值不被视为重复键。您可以将其称为IsActiveFlag
。
如果你有这样一个列,那么索引:
create index idx_cart(userid, courseid, IsActiveFlag)