> Faqs > Solucionar error al crear el índice en migración constrained() a foreignId() en Laravel

Solucionar error al crear el índice en migración constrained() a foreignId() en Laravel

Quiero hacer una migración en Laravel que añade una clave foreign. La hago con este código

$table->foreignId('customer_id')->nullable()->constrained();

El problema es que, al ponerle el constrained() intenta hacer un índice con una clave bigint y en la tabla que estoy relacionando (customers) el id es int. Creo que por eso me da el error. ¿hay una manera de decirle que la relación es con un campo id que es de tipo int y no bigint?

Ya de paso, cómo se haría el código para hacer el down de esa migración (rollback)?

Respuestas

A ver... si las claves foráneas en Laravel tienen tipos que son distintos puedes especificar el índice de una manera aparte, tal como se hacía antiguamente, antes que apareciera el método foreignId, ya que foreignId(), por defecto crea una columna BIGINT. Si en tu tabla customers el id es de tipo INT, deberías crear la clave foránea manualmente si quieres que tenga un índice e integridad referencial.

Puedes hacerlo de la siguiente manera:

$table->unsignedInteger('customer_id')->nullable();
$table->foreign('customer_id')->references('id')->on('customers');

En este ejemplo has indicado el tipo del campo en la relación, unsignedInteger('customer_id'), que crea una columna planning_id de tipo INT UNSIGNED. Mira a ver si no es unsigned el id, en cuyo caso simplemente crearlo como Integer('customer_id').

Ahora al crear el índice no te debería dar problemas, si es que ese es el problema que estaba ocurriendo en tu caso.

Ya para hacer el down de la migración y que se haga el rollback tienes que hacer de nuevo los dos pasos. Primero borras el índice y luego el campo. Sería más o menos así:

$table->dropForeign(['customer_id']); 
$table->dropColumn('customer_id');

Por supuesto, todo esto contando con que las convenciones de nombrado de campos y tablas de Laravel las estés cubriendo, porque si no las sigues las sentencias serían un poco más complejas.

Miguel Angel
3073 138 204 16