Я знаю, что есть много сообщений об этом, но есть несколько вещей, на которые ни один из них не ответил до сих пор. Не здесь или на форуме Laracast.

№ 1 . Как лучше всего это делать? Я видел несколько разных способов сделать это. Должен ли я установить его в модели или в контроллере? Есть ли автоматизированный способ или это просто функция PHP str_random(6)?

№ 2 . Как определить, что вновь сгенерированный ключ может быть дубликатом? Нужно ли проверять это вручную? Я знаю, что Laravel выдаст дерьмовую ошибку, если вы попытаетесь ввести дубликат в БД, и я не хочу, чтобы такая ошибка возникала в живом приложении.

№3 . Будет ли это замедлять работу приложения? Я предполагаю, что если он должен проверять дубликаты, если БД велика, это будет медленно.

№ 4 . Должно ли это быть сделано? Я хочу передать этот ключ клиентам на сайте, например, в качестве ключа транзакции. Я не хочу знать их, как могли транзакции, которые были до их, или дать им какую-либо информацию об этом. Причины безопасности.

Я мог угадать ответы, но я не уверен на 100%. Если бы кто-то сделал это, я был бы признателен за любые ответы.

0
Ognjen Stefanovic 2 Мар 2018 в 18:28

4 ответа

Лучший ответ

Я хотел бы использовать целочисленный первичный ключ и добавить отдельный столбец для строкового ключа (с уникальным индексом). Целочисленные ключи быстрее и проще в обращении (на соединениях и т. Д.).

Если строковый ключ имеет фиксированную длину, вы должны использовать столбец CHAR для достижения максимальной производительности.

Я бы положил генерацию ключей в контроллер:

$key = str_random(6);
while(YourModel::where('key', $key)->exists()) {
    $key = str_random(6);
}
$yourModel->key = $key;

Или просто попробуйте ключ и поймайте маловероятный случай повторного значения:

$yourModel->key = str_random(6);
try {
    $yourModel->save();
catch(Illuminate\Database\QueryException $e) {
    <code from above>
    $yourModel->save();  
}
2
Jonas Staudenmeir 2 Мар 2018 в 16:02

Я согласен с @Jonas Staudenmeir, что вы не должны использовать это в качестве первичного ключа. Вы не оказываете БД никаких услуг, если делаете это. Вместо этого рассматривайте это как обычные данные приложения; в частности, это звучит как слизняк.

Если вы создаете инструмент для генерации этого ключа, вы можете проверить его как любой другой столбец, чтобы убедиться, что он уникален.

0
waterloomatt 2 Мар 2018 в 16:01

№ 1 : вы можете использовать uniqid(), он сгенерирует уникальный идентификатор на основе текущего времени в микросекундах, вы можете сделать это просто для того, чтобы убедиться, что он уникален $id = uniqid().str_random(5);

№ 2 : используя приведенный выше ответ, почти невозможно получить дубликаты ключей, но вы можете сделать это на 100%, избегая его

try {
   $model->id = uniqid().str_random(5);
   $model->save();
}catch(\Exception $e)
{
 if something wrong happens try again or you can make it recrussive until it's able to save a unique key
}

№ 3 : я так думаю

№ 4 : я не рекомендую создавать другой столбец, который также является уникальным, но это то, что вы даете пользователям, но это не первичный ключ. таким образом, вы можете дать каждому клиенту / пользователю уникальный ключ, чтобы вы могли позже получить его данные, используя его, в то же время используя автоинкремент в качестве первичного ключа для других операций.

Удачи

1
Achraf Khouadja 2 Мар 2018 в 15:58

Я не думаю, что это хороший дизайн для генерации случайных строк в качестве первичных ключей.

Если вы хотите «скрыть» свои идентификаторы транзакций, вы можете просто хэшировать / скрывать ключ таблицы с помощью vinkla / Laravel - hashids.

Классная ссылка: easy-id-obfuscation-with-laravel-5

2
Ramy Herrira 2 Мар 2018 в 16:03