Laravel 使用队列时的唯一序列号(1个工作进程)

Laravel 使用队列时的唯一序列号(1个工作进程),laravel,eloquent,laravel-5.7,Laravel,Eloquent,Laravel 5.7,我正在尝试生成唯一、连续的发票编号。发票是使用一个队列生成的,有1个工作人员,但在160张发票中,有28张仍然以重复编号结束。 下面是用于生成唯一发票编号的代码 public static function getNewInvoiceNumber(String $prefix) { $lastNumber = App\Invoice::where('invoiceNumber', 'LIKE', $prefix . now()->year . '-%')->orderByDe

我正在尝试生成唯一、连续的发票编号。发票是使用一个队列生成的,有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;
}

您是否尝试为invoiceNumber字段提供唯一约束?您只需要捕获期望值并最终重试。这就是我现在正在做的,但我不希望依赖捕获异常并重试。我不确定它是否解决了问题,但我使用->value(DB::raw(“MAX(invoiceNumber COLLATE utf8\u unicode\u ci)”)而不是->orderByDesc('invoiceID')->first()->invoiceNumber and works for meI认为问题在于按invoiceID排序,而不是invoiceNumber如果这不是一个视觉协调问题,那么您可以将PHP中的
time()
的结果添加到其中,这是1秒内唯一的时间戳。如果您将其与某些产品-供应商代码相结合,那么即使在同一秒创建了两个发票,也应该是唯一的。您是否尝试对invoiceNumber字段进行唯一约束?您只需要捕获期望值并最终重试。这就是我现在正在做的,但我不希望依赖捕获异常并重试。我不确定它是否解决了问题,但我使用->value(DB::raw(“MAX(invoiceNumber COLLATE utf8\u unicode\u ci)”)而不是->orderByDesc('invoiceID')->first()->invoiceNumber and works for meI认为问题在于按invoiceID排序,而不是invoiceNumber如果这不是一个视觉协调问题,那么您可以将PHP中的
time()
的结果添加到其中,这是1秒内唯一的时间戳。如果您将其与一些产品供应商代码结合起来,那么即使在同一秒创建了两张发票,也应该是唯一的