2015-12-13 1 views
1

Мне нужно создать промокоды, которые должны быть короткими по длине (~ 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; 
} 

Нужны предложения, как улучшить это? Или если у меня может быть другой способ добиться того же.

ответ

1

Убедитесь, что промо-код указан в вашей БД. Это ускорит поиск существующих промо-кодов.

В противном случае, ваш метод хорош! вы хотите проверить как можно больше кодов сразу (что вы делаете с whereIn/count) и только повторно генерировать коды, которые не были уникальными.

1

Построить стол new_codes с 1000 кандидатами. PRIMARY KEY(code).

DELETE new_codes 
    FROM new_codes 
    LEFT JOIN existing_codes ON existing_codes.code = new_codes.code 
    WHERE existing_codes.code IS NOT NULL; 

Это (если бы я сделал это правильно) очень быстро удалит дубликаты. Теперь у вас будут не-1000 «хороших» кодов.

+0

Thank you @Rick - Таким образом мне придется повторять новые вставки, так как после удаления мне нужно проверить, сколько из них было удалено и регенерировать одно и то же число снова рекурсивно? – Ehs4n

+0

Я предполагал, что числа поступают из генератора случайных чисел, поэтому они в большинстве раз различаются каждый раз? Создайте с ними 1000-строку 'INSERT' с надписью' DELETE'. –

Смежные вопросы