Страница 1 из 1

Уникальный код по таблице

Добавлено: 2019.10.21, 04:44
Ghost_nsk
Товарищи, привет. Интересует такой вопрос, есть таблица в базе, там какие-то данные. У каждой записи таблицы, есть какой-то уникальный параметр, например, code (varchar 10). Как при создании новой записи, автоматически генерить запись c code, который не похож на другие (уникален)?

Re: Уникальный код по таблице

Добавлено: 2019.10.21, 09:23
ElisDN
bin2hex(random_bytes(5)) с проверкой по БД на уникальность.

А если длина не критична, то лучше Ramsey\Uuid::uuid4()->toString().

Re: Уникальный код по таблице

Добавлено: 2019.10.21, 09:52
Ghost_nsk
ElisDN писал(а):
2019.10.21, 09:23
bin2hex(random_bytes(5)) с проверкой по БД на уникальность.

А если длина не критична, то лучше Ramsey\Uuid::uuid4()->toString().
насколько я понимаю, если в rules добавить unique валидатор, он просто не пропустит модель при сохранении, если будет дубликат по ключу? или я неправильно понимаю?

Re: Уникальный код по таблице

Добавлено: 2019.10.21, 09:54
ElisDN
Да, форма не сохранится и придётся отправлять снова.

Re: Уникальный код по таблице

Добавлено: 2019.10.21, 10:02
Ghost_nsk
ElisDN писал(а):
2019.10.21, 09:54
Да, форма не сохранится и придётся отправлять снова.
это я понимаю, но мне нужно, чтобы форма сохранилась 100%, то есть если код уже есть в базе, видимо как-то в цикле проверять надо, пока не будет найден код, которого в базе нет. Насколько это костыльно?

Re: Уникальный код по таблице

Добавлено: 2019.10.21, 11:13
ElisDN
Про это и говорю, что в случае своих коротких кодов генерировать нужно сразу с проверкой уникальности:

Код: Выделить всё

do {
    $code = bin2hex(random_bytes(5));
} while (Entity::find()->andWhere(['code' => $code])->exists())
А если использовать длинный UUID, то проверка не нужна.

Re: Уникальный код по таблице

Добавлено: 2019.10.21, 11:20
Ghost_nsk
ElisDN писал(а):
2019.10.21, 11:13
Про это и говорю, что в случае своих коротких кодов генерировать нужно сразу с проверкой уникальности:

Код: Выделить всё

do {
    $code = bin2hex(random_bytes(5));
} while (Entity::find()->andWhere(['code' => $code])->exists())
А если использовать длинный UUID, то проверка не нужна.
примерно так и думал, спасибо