Вы можете использовать microtime для обработки ваших счетов. Вероятность дублирования записей очень мала; хотя для дизайна я бы выбрал блокировку таблиц (см. полный ответ)
$inv->number = str_replace(' ', '', microtime());
$inv->save();
Несколько человек из разных компаний генерируют счета за раз.
Рандомизация данных или их приращение - не путь к go в этом случае. Если вы генерируете счета на основе пользовательского шаблона, который использует в качестве переменных данные из базы данных, шансы на создание дубликатов высоки. Вам следует заблокировать таблицы, с которыми вы работаете, для текущей транзакции. Это предотвратит вставку дублированных данных. Я не знаю всей вашей структуры базы данных, хотя я предлагаю демонстрационную версию:
LOCK TABLES working_table WRITE, working_table2 WRITE;
INSERT INTO working_table ( ... )
VALUES ( ...,
(SELECT number
FROM working_table2
WHERE series = 'prefix'
ORDERBY number DESC
LIMIT 1)+1
);
UNLOCK TABLES;
Затем вы можете вызвать оператор sql следующим образом:
DB::select("
LOCK TABLES working_table WRITE, working_table2 WRITE;
INSERT INTO working_table ( column )
VALUES (
(SELECT number
FROM working_table2
WHERE series = ?
ORDERBY number DESC
LIMIT 1)+1
);
UNLOCK TABLES;
", [ 'param1' ]) // these are the parameters to prepare
Примечание: Если вы используете постоянные подключения к базе данных, вы должны обработать все сгенерированные ошибки из приложения Laravel, потому что необработанные ошибки остановят сценарий, не останавливая дочерний дочерний процесс, который поддерживает подключение к базе данных. При удалении дочернего процесса таблицы блокируются! , поскольку база данных блокирует их для сеанса соединения. Пожалуйста, прочитайте этот пост для получения подробной информации об этом поведении.