Sé que hay muchas publicaciones sobre este, pero hay algunas cosas que ninguno de ellos respondió hasta ahora. No aquí ni en el foro de Laracast.

No.1 : ¿Cuál es la mejor práctica para hacer esto? Vi un par de maneras diferentes de hacer esto. ¿Debo configurarlo en Modelo o en el Controlador? ¿Existe una forma automatizada o es solo la función PHP str_random(6)?

No.2 : ¿Cómo abordar la posibilidad de que la clave recién generada pueda ser un duplicado? ¿Tengo que verificarlo manualmente? Sé que Laravel arrojará el error de basura si intentaste ingresar un duplicado en DB y no quiero ese tipo de error en la aplicación en vivo.

No3 : ¿disminuirá la velocidad de la aplicación? Supongo que si tiene que buscar duplicados, si la base de datos es grande, sería lenta.

No.4 : ¿Debería hacerse esto? Quiero dar esta clave a los clientes en el sitio, como su clave de transacción, por ejemplo. No quiero saber cómo pueden haber muchas transacciones antes de la suya ni darles información al respecto. Razones de seguridad.

Podría adivinar las respuestas, pero no estoy 100% seguro. Si alguien ha hecho esto, agradecería cualquier respuesta.

0
Ognjen Stefanovic 2 mar. 2018 a las 18:28

4 respuestas

La mejor respuesta

Usaría una clave primaria entera y agregaría una columna separada para la clave de cadena (con un índice único). Las teclas enteras son más rápidas y fáciles de manejar (en combinaciones, etc.).

Si la clave de cadena tiene una longitud fija, debe usar una columna CHAR para obtener el mejor rendimiento.

Pondría la generación de claves en el controlador:

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

O simplemente prueba una clave y detecta el caso poco probable de un valor duplicado:

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

Estoy de acuerdo con @Jonas Staudenmeir en que no debe usar esto como clave principal. No estás haciendo ningún favor al DB si haces esto. En cambio, trátelo como datos de aplicación regulares; específicamente, suena como una babosa.

Si está creando una herramienta para generar esta clave, puede validarla como cualquier otra columna para asegurarse de que sea única.

0
waterloomatt 2 mar. 2018 a las 16:01

No.1 : puede usar uniqid(), generará un identificador único basado en la hora actual en microsegundos, puede hacerlo solo para asegurarse de que sea único $id = uniqid().str_random(5);

No.2 : usando la respuesta anterior es casi imposible obtener claves duplicadas, pero puede hacerlo para evitarlo al 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
}

No.3 : supongo que sí

No.4 : no lo recomiendo, cree otra columna que también sea única, pero es algo que le da a los usuarios, pero no es la clave principal. de esta manera, puede dar a cada cliente / usuario una clave única para que pueda obtener sus datos más tarde usándola mientras sigue utilizando el incremento automático como clave principal para otras operaciones.

Buena suerte

1
Achraf Khouadja 2 mar. 2018 a las 15:58

No creo que sea un buen diseño generar cadenas aleatorias como claves principales.

Si desea "ocultar" sus identificadores de transacción, simplemente puede hacer hash / ofuscar su clave de tabla con vinkla / laravel-hashids.

Enlace genial: easy-id-obfuscation-with-laravel-5

2
Ramy Herrira 2 mar. 2018 a las 16:03