Мне нужно сгенерировать уникальный инкрементный номер счета (строка) по последней дате добавленного номера. Номер счета не имеет формата по умолчанию, пользователь может зарегистрировать любую строку по своему усмотрению. Примеры: 00001, ab c, EP-2018 / 00005..et c.
Хорошо, как нужно работать? Если пользователь регистрирует строку 0001 в качестве номера счета, то на странице «Добавить новый счет» необходимо отобразить следующий инкрементный номер, в этом случае будет 0002. Если пользователь зарегистрирует счет со строкой ab c в качестве номера счета, то на странице «Добавить новый счет», необходимо отобразить абд. Итак, как вы видите, это зависит от последней даты добавленного номера, поскольку вторая строка была ab c, теперь мы видим на странице «Добавить новый счет» abd следующий уникальный номер.
Другой пример, и здесь работа становится очень сложной: если в db у нас уже есть счет с номером «abd», а он очень старый, то нам нужно получить следующий инкремент, а это «abe».
Таблица базы данных " счета " :
- идентификатор (автоинкремент)
- число (строка)
- updated_at (отметка времени)
Пример 1:
id | number | updated_at
------------------------
1 abc 2020-03-14 11:50:09
2 abd 2020-03-14 11:39:03
Итак, последнее обновленное / добавленное число - «ab c», следующее число должно быть «abe»
Пример 2:
id | number | updated_at
------------------------
1 abe 2020-03-14 11:49:09
2 abc 2020-03-14 11:50:09
3 abd 2020-03-14 11:49:09
4 00001 2020-03-15 10:45:52
5 abf 2020-03-15 10:42:50
Итак, последний обновленный / добавленный номер - "00001", следующий номер должен быть "00002"
Я пробовал это:
$latestByUpdatedDate = Invoice::latest('updated_at')->first();
$latestByNumber = Invoice::latest('number')->first();
if($latestByUpdatedDate > $latestByNumber){
return ++$latestByUpdatedDate->number;
}
return ++$latestByNumber->number;
Все работает хорошо, если $ latestByUpdatedDate и $ latestByNumber содержат только символы или только цифры c, если попытаться сравнить 00001 с ab c, результат будет равен неправильно.