Я пытаюсь создать уникальные, последовательные номера счетов. Счета-фактуры генерируются с использованием очереди с 1 работником, но из 160 счетов-фактур 28 по-прежнему имеют повторяющиеся номера. Ниже приведен код, используемый для создания уникального номера счета.
public static function getNewInvoiceNumber(String $prefix)
{
$lastNumber = App\Invoice::where('invoiceNumber', 'LIKE', $prefix . now()->year . '-%')->orderByDesc('invoiceID')->first()->invoiceNumber ?? '0';
$newNumber = (int)substr($lastNumber, strlen($prefix . now()->year . '-')) + 1;
while (App\Invoice::where('invoiceNumber', $prefix . now()->year . '-' . $newNumber)->exists()) {
$newNumber++;
}
return $newNumber;
}
Это то, что я делаю сейчас, но я бы предпочел не полагаться на перехват исключений и просто пытаться снова.
Я не уверен, решит ли это проблему, но я использую ->value(DB::raw("MAX(invoiceNumber COLLATE utf8_unicode_ci)")) вместо ->orderByDesc('invoiceID')->first()->invoiceNumber и работает на меня
Я думаю, что проблема в заказе по invoiceID, а не по номеру счета
Если это не проблема визуальной гармонизации, то вы можете добавить к нему результат time() в PHP, который представляет собой уникальные временные метки в течение 1 секунды. И если вы соедините это с некоторым кодом продукта - поставщика, он должен быть уникальным, даже если 2 счета-фактуры создаются в одну и ту же секунду.






Вы пытались задать УНИКАЛЬНОЕ ограничение для поля invoiceNumber? Вам нужно только поймать ожидание и, в конце концов, повторить попытку.