Laravel & MySQL 优惠券使用后可重复领取逻辑

发布时间: 2017-12-21 13:11:59 作者: 大象笔记

原设计

一个用户对同一优惠券领取一次,即使使用了,也无法重复领取

但这样的表设计,不能支持同一优惠券使用后再次领取。

解决方案

利用 MySQL unique 允许多个 null 的存在的特性。参考 MySQL 唯一约束 Unique 是否允许存在多个 NULL 值

这样就可以保证数据库不会重复插入,即,用户不会瞬间同时领取同一优惠券。

Laravel 中处理 unique 异常

local.ERROR: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '7-996-1' for key 'unique_cid_uid'

try {
	$user_coupon->save();
} catch (\Illuminate\Database\QueryException $e){
	$errorCode = $e->errorInfo[1];
	if($errorCode == 1062){
		$rsp['err_code'] = Error::DUPLICATE;
		$rsp['err_msg'] = '不能重复领取同一优惠券';
	}
}
我是一名山东烟台的开发者,联系作者