【发布时间】:2016-03-19 04:21:47
【问题描述】:
我需要创建长度应该很短(约 6 个字符)的促销代码。促销代码必须是唯一的,因此我还需要检查它们在数据库中的唯一性。它们需要成批生成数千个,因此每次生成优惠券时都检查数据库是不可行的。我创建了一个方法,它首先生成所需数量的优惠券,然后使用 where in() 检查重复项。重复计数大于零,使其再次生成计数。
public function generateCoupons($count, $length = 6)
{
$coupons = [];
while(count($coupons) < $count) {
do {
$coupon = strtoupper(str_random($length));
} while (in_array($coupon, $coupons));
$coupons[] = $coupon;
}
$existing = Offer::whereIn('coupon', $coupons)->count();
if ($existing > 0)
$coupons += $this->generateCoupons($existing, $length);
return (count($coupons) == 1) ? $coupons[0] : $coupons;
}
需要建议如何改进?或者如果我可以有其他方法来实现同样的目标。
【问题讨论】:
标签: php mysql database optimization