Мне нужно создать промокоды, которые должны быть короткими по длине (~ 6 символов). Промо-коды должны быть уникальными, поэтому мне нужно также проверить их уникальность в базе данных. Их нужно создавать партиями в тысячах, поэтому проверка в db с каждым созданием купона невозможна. Я создал метод, который сначала генерирует необходимое количество купонов, а затем проверяет наличие дубликатов, используя 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;
}
Нужны предложения, как улучшить это? Или если у меня может быть другой способ добиться того же.
Thank you @Rick - Таким образом мне придется повторять новые вставки, так как после удаления мне нужно проверить, сколько из них было удалено и регенерировать одно и то же число снова рекурсивно? – Ehs4n
Я предполагал, что числа поступают из генератора случайных чисел, поэтому они в большинстве раз различаются каждый раз? Создайте с ними 1000-строку 'INSERT' с надписью' DELETE'. –