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

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Ghost_nsk
Сообщения: 797
Зарегистрирован: 2012.01.01, 00:45
Откуда: Новосибирск
Контактная информация:

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

Сообщение Ghost_nsk » 2019.10.21, 04:44

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

Аватара пользователя
ElisDN
Сообщения: 5428
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

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

Сообщение ElisDN » 2019.10.21, 09:23

bin2hex(random_bytes(5)) с проверкой по БД на уникальность.

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

Аватара пользователя
Ghost_nsk
Сообщения: 797
Зарегистрирован: 2012.01.01, 00:45
Откуда: Новосибирск
Контактная информация:

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

Сообщение Ghost_nsk » 2019.10.21, 09:52

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

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

Аватара пользователя
ElisDN
Сообщения: 5428
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

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

Сообщение ElisDN » 2019.10.21, 09:54

Да, форма не сохранится и придётся отправлять снова.

Аватара пользователя
Ghost_nsk
Сообщения: 797
Зарегистрирован: 2012.01.01, 00:45
Откуда: Новосибирск
Контактная информация:

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

Сообщение Ghost_nsk » 2019.10.21, 10:02

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

Аватара пользователя
ElisDN
Сообщения: 5428
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

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

Сообщение ElisDN » 2019.10.21, 11:13

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

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

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

Аватара пользователя
Ghost_nsk
Сообщения: 797
Зарегистрирован: 2012.01.01, 00:45
Откуда: Новосибирск
Контактная информация:

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

Сообщение Ghost_nsk » 2019.10.21, 11:20

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

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

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

Ответить