Las migraciones son como control de versiones para su base de datos, permitiendo que su equipo defina y comparta la definición del esquema de la base de datos de la aplicación. Si alguna vez tuvo que decirle a un compañero de equipo que agregara manualmente una columna a su esquema de base de datos local después de extraer sus cambios del control de fuente, ha enfrentado el problema que resuelven las migraciones de bases de datos.
La fachada Schema de Laravel proporciona soporte independiente de la base de datos para crear y manipular tablas en todos los sistemas de bases de datos admitidos por Laravel. Por lo general, las migraciones usarán esta fachada para crear y modificar tablas y columnas de bases de datos.
Puede usar el comando Artisan make:migration para generar una migración de base de datos. La nueva migración se colocará en su directorio database/migrations. Cada nombre de archivo de migración contiene una marca de tiempo que permite a Laravel determinar el orden de las migraciones:
Laravel utilizará el nombre de la migración para intentar adivinar el nombre de la tabla y si la migración creará o no una nueva tabla. Si Laravel puede determinar el nombre de la tabla a partir del nombre de la migración, Laravel completará automáticamente el archivo de migración generado con la tabla especificada. De lo contrario, puede especificar manualmente la tabla en el archivo de migración.
Si desea especificar una ruta personalizada para la migración generada, puede usar la opción --path al ejecutar el comando make:migration. La ruta dada debe ser relativa a la ruta base de su aplicación.
Nota Las plantillas de migración pueden personalizarse mediante publicación de plantillas.
A medida que construye su aplicación, puede acumular más y más migraciones con el tiempo. Esto puede llevar a que su directorio database/migrations se llene de posiblemente cientos de migraciones. Si lo desea, puede "comprimir" sus migraciones en un solo archivo SQL. Para comenzar, ejecute el comando schema:dump:
Cuando ejecute este comando, Laravel escribirá un archivo "esquema" en el directorio database/schema de su aplicación. El nombre del archivo de esquema corresponderá a la conexión de la base de datos. Ahora, cuando intente migrar su base de datos y no se hayan ejecutado otras migraciones, Laravel ejecutará primero las declaraciones SQL en el archivo de esquema de la conexión de la base de datos que está utilizando. Después de ejecutar las declaraciones SQL del archivo de esquema, Laravel ejecutará cualquier migración restante que no formara parte del volcado del esquema:
Si las pruebas de su aplicación utilizan una conexión de base de datos diferente a la que suele usar durante el desarrollo local, asegúrese de haber volcado un archivo de esquema usando esa conexión de base de datos para que sus pruebas puedan construir su base de datos. Puede desear hacer esto después de volcar la conexión de base de datos que suele usar durante el desarrollo local:
Debería comprometer su archivo de esquema de base de datos en el control de origen para que otros desarrolladores nuevos en su equipo puedan crear rápidamente la estructura inicial de la base de datos de su aplicación.
Advertencia La compresión de migraciones solo está disponible para las bases de datos MySQL, PostgreSQL y SQLite y utiliza el cliente de línea de comandos de la base de datos. Las volcadas de esquema no se pueden restaurar en bases de datos SQLite en memoria.
Una clase de migración contiene dos métodos: up y down. El método up se utiliza para agregar nuevas tablas, columnas o índices a su base de datos, mientras que el método down debe revertir las operaciones realizadas por el método up.
Dentro de ambos de estos métodos, puede usar el generador de esquemas de Laravel para crear y modificar tablas de manera expresiva. Para conocer todos los métodos disponibles en el generador de esquemas Schema, consulte su documentación. Por ejemplo, la siguiente migración crea una tabla flights:
Si su migración interactuará con una conexión de base de datos diferente a la conexión de base de datos predeterminada de su aplicación, debe establecer la propiedad $connection de su migración:
Para ejecutar todas sus migraciones pendientes, ejecute el comando Artisan migrate:
Si desea ver qué migraciones se han ejecutado hasta ahora, puede usar el comando Artisan migrate:status:
Si desea ver las declaraciones SQL que se ejecutarán con las migraciones sin ejecutarlas realmente, puede proporcionar la bandera --pretend al comando migrate:
Si está implementando su aplicación en varios servidores y ejecutando migraciones como parte de su proceso de implementación, es probable que no desee que dos servidores intenten migrar la base de datos al mismo tiempo. Para evitar esto, puede usar la opción isolated al invocar el comando migrate.
Cuando se proporciona la opción isolated, Laravel adquirirá un bloqueo atómico utilizando el controlador de caché de su aplicación antes de intentar ejecutar sus migraciones. Todos los demás intentos de ejecutar el comando migrate mientras se mantiene ese bloqueo no se ejecutarán; sin embargo, el comando seguirá saliendo con un código de estado de salida exitoso:
Advertencia Para utilizar esta función, su aplicación debe utilizar los controladores de caché
memcached,redis,dynamodb,database,fileoarraycomo controlador de caché predeterminado. Además, todos los servidores deben comunicarse con el mismo servidor central de caché.
Algunas operaciones de migración son destructivas, lo que significa que pueden causar la pérdida de datos. Para protegerlo de ejecutar estos comandos contra su base de datos de producción, se le pedirá confirmación antes de que se ejecuten los comandos. Para forzar la ejecución de los comandos sin un aviso, use la bandera --force:
Para deshacer la última operación de migración, puede usar el comando Artisan rollback. Este comando deshace el último "lote" de migraciones, que puede incluir varios archivos de migración:
Puede deshacer un número limitado de migraciones proporcionando la opción step al comando rollback. Por ejemplo, el siguiente comando deshará las últimas cinco migraciones:
Puede deshacer un "lote" específico de migraciones proporcionando la opción batch al comando rollback, donde la opción batch corresponde a un valor de lote dentro de la tabla de base de datos migrations de su aplicación. Por ejemplo, el siguiente comando deshará todas las migraciones en el lote tres:
Si desea ver las declaraciones SQL que se ejecutarán con las migraciones sin ejecutarlas realmente, puede proporcionar la bandera --pretend al comando migrate:rollback:
El comando migrate:reset deshará todas las migraciones de su aplicación:
El comando migrate:refresh deshará todas sus migraciones y luego ejecutará el comando migrate. Este comando recrea efectivamente toda su base de datos:
Puede deshacer y volver a migrar un número limitado de migraciones proporcionando la opción step al comando refresh. Por ejemplo, el siguiente comando deshará y volverá a migrar las últimas cinco migraciones:
El comando migrate:fresh eliminará todas las tablas de la base de datos y luego ejecutará el comando migrate:
Advertencia El comando
migrate:fresheliminará todas las tablas de la base de datos independientemente de su prefijo. Este comando debe usarse con precaución al desarrollar en una base de datos compartida con otras aplicaciones.
Para crear una nueva tabla de base de datos, use el método create en la fachada Schema. El método create acepta dos argumentos: el primero es el nombre de la tabla, mientras que el segundo es un cierre que recibe un objeto Blueprint que se puede usar para definir la nueva tabla:
Al crear la tabla, puede utilizar cualquiera de los métodos de columna del generador de esquemas para definir las columnas de la tabla.
Puede verificar la existencia de una tabla o columna utilizando los métodos hasTable y hasColumn:
Si desea realizar una operación de esquema en una conexión de base de datos que no sea la conexión predeterminada de su aplicación, utilice el método connection:
Además, se pueden utilizar algunas otras propiedades y métodos para definir otros aspectos de la creación de la tabla. La propiedad engine se puede usar para especificar el motor de almacenamiento de la tabla al usar MySQL:
Las propiedades charset y collation se pueden utilizar para especificar el conjunto de caracteres y la intercalación para la tabla creada al usar MySQL:
El método temporary se puede utilizar para indicar que la tabla debe ser "temporal". Las tablas temporales solo son visibles para la sesión de base de datos de la conexión actual y se eliminan automáticamente cuando se cierra la conexión:
Si desea agregar un "comentario" a una tabla de base de datos, puede invocar el método comment en la instancia de la tabla. Los comentarios de tabla solo son compatibles actualmente con MySQL y Postgres:
El método table en la fachada Schema se puede utilizar para actualizar tablas existentes. Al igual que el método create, el método table acepta dos argumentos: el nombre de la tabla y un cierre que recibe una instancia de Blueprint que puede usar para agregar columnas o índices a la tabla:
Para cambiar el nombre de una tabla de base de datos existente, utilice el método rename:
Para eliminar una tabla existente, puede utilizar los métodos drop o dropIfExists:
Antes de cambiar el nombre de una tabla, debe verificar que las restricciones de clave externa en la tabla tengan un nombre explícito en sus archivos de migración en lugar de dejar que Laravel asigne un nombre basado en convenciones. De lo contrario, el nombre de la restricción de clave externa hará referencia al antiguo nombre de la tabla.
El método table en la fachada Schema se puede utilizar para actualizar tablas existentes. Al igual que el método create, el método table acepta dos argumentos: el nombre de la tabla y un cierre que recibe una instancia de Illuminate\Database\Schema\Blueprint que puede usar para agregar columnas a la tabla:
El generador de esquemas ofrece una variedad de métodos que corresponden a los diferentes tipos de columnas que puede agregar a sus tablas de base de datos. Cada uno de los métodos disponibles se enumera en la tabla a continuación:
bigIncrements()El método bigIncrements crea una columna equivalente a UNSIGNED BIGINT (clave principal y autoincremento):
bigInteger()El método bigInteger crea una columna equivalente a BIGINT:
binary()El método binary crea una columna equivalente a BLOB:
boolean()El método boolean crea una columna equivalente a BOOLEAN:
char()El método char crea una columna equivalente a CHAR con una longitud dada:
dateTimeTz()El método dateTimeTz crea una columna equivalente a DATETIME (con zona horaria) con una precisión opcional (dígitos totales):
dateTime()El método dateTime crea una columna equivalente a DATETIME con una precisión opcional (dígitos totales):
date()El método date crea una columna equivalente a DATE:
decimal()El método decimal crea una columna equivalente a DECIMAL con la precisión (dígitos totales) y la escala (dígitos decimales) dadas:
double()El método double crea una columna equivalente a DOUBLE con la precisión (dígitos totales) y la escala (dígitos decimales) dadas:
enum()El método enum crea una columna equivalente a ENUM con los valores válidos dados:
float()El método float crea una columna equivalente a FLOAT con la precisión (dígitos totales) y la escala (dígitos decimales) dadas:
foreignId()El método foreignId crea una columna equivalente a UNSIGNED BIGINT:
foreignIdFor()El método foreignIdFor agrega una columna {column}_id equivalente para una clase de modelo dada. El tipo de columna será UNSIGNED BIGINT, CHAR(36) o CHAR(26) según el tipo de clave del modelo:
foreignUlid()El método foreignUlid crea una columna equivalente a ULID:
foreignUuid()El método foreignUuid crea una columna equivalente a UUID:
geometryCollection()El método geometryCollection crea una columna equivalente a GEOMETRYCOLLECTION:
geometry()El método geometry crea una columna equivalente a GEOMETRY:
id()El método id es un alias del método bigIncrements. Por defecto, el método creará una columna id; sin embargo, puede pasar un nombre de columna si desea asignar un nombre diferente a la columna:
increments()El método increments crea una columna equivalente a UNSIGNED INTEGER (clave principal y autoincremento):
integer()El método integer crea una columna equivalente a INTEGER:
ipAddress()El método ipAddress crea una columna equivalente a VARCHAR:
Cuando se utiliza Postgres, se creará una columna INET.
json()El método json crea una columna equivalente a JSON:
jsonb()El método jsonb crea una columna equivalente a JSONB:
lineString()El método lineString crea una columna equivalente a LINESTRING:
longText()El método longText crea una columna equivalente a LONGTEXT:
macAddress()El método macAddress crea una columna destinada a contener una dirección MAC. Algunos sistemas de base de datos, como PostgreSQL, tienen un tipo de columna dedicado para este tipo de datos. Otros sistemas de base de datos usarán una columna equivalente de tipo cadena:
mediumIncrements()El método mediumIncrements crea una columna equivalente a UNSIGNED MEDIUMINT (clave principal y autoincremento):
mediumInteger()El método mediumInteger crea una columna equivalente a MEDIUMINT:
mediumText()El método mediumText crea una columna equivalente a MEDIUMTEXT:
morphs()El método morphs es un método de conveniencia que agrega una columna {column}_id equivalente y una columna {column}_type equivalente de tipo VARCHAR. El tipo de columna para {column}_id será UNSIGNED BIGINT, CHAR(36) o CHAR(26) según el tipo de clave del modelo.
Este método está destinado a utilizarse al definir las columnas necesarias para una relación polimórfica de Eloquent. En el siguiente ejemplo, se crearían las columnas taggable_id y taggable_type:
multiLineString()El método multiLineString crea una columna equivalente a MULTILINESTRING:
multiPoint()El método multiPoint crea una columna equivalente a MULTIPOINT:
multiPolygon()El método multiPolygon crea una columna equivalente a MULTIPOLYGON:
nullableTimestamps()El método nullableTimestamps es un alias del método timestamps:
nullableMorphs()El método es similar al método morphs; sin embargo, las columnas que se crean serán "anulables":
nullableUlidMorphs()El método es similar al método ulidMorphs; sin embargo, las columnas que se crean serán "anulables":
nullableUuidMorphs()El método es similar al método uuidMorphs; sin embargo, las columnas que se crean serán "anulables":
point()El método point crea una columna equivalente a POINT:
polygon()El método polygon crea una columna equivalente a POLYGON:
rememberToken()El método rememberToken crea una columna anulable equivalente a VARCHAR(100) destinada a almacenar el actual "recordar token" token de autenticación:
set()El método set crea una columna equivalente a SET con la lista dada de valores válidos:
smallIncrements()El método smallIncrements crea una columna equivalente a UNSIGNED SMALLINT (clave principal y autoincremento):
smallInteger()El método smallInteger crea una columna equivalente a SMALLINT:
softDeletesTz()El método softDeletesTz agrega una columna deleted_at anulable equivalente a TIMESTAMP (con zona horaria) con una precisión opcional (dígitos totales). Esta columna está destinada a almacenar la marca de tiempo deleted_at necesaria para la funcionalidad de "soft delete" de Eloquent:
softDeletes()El método softDeletes agrega una columna deleted_at anulable equivalente a TIMESTAMP con una precisión opcional (dígitos totales). Esta columna está destinada a almacenar la marca de tiempo deleted_at necesaria para la funcionalidad de "soft delete" de Eloquent:
string()El método string crea una columna equivalente a VARCHAR con la longitud dada:
text()El método text crea una columna equivalente a TEXT:
timeTz()El método timeTz crea una columna equivalente a TIME (con zona horaria) con una precisión opcional (dígitos totales):
time()El método time crea una columna equivalente a TIME con una precisión opcional (dígitos totales):
timestampTz()El método timestampTz crea una columna equivalente a TIMESTAMP (con zona horaria) con una precisión opcional (dígitos totales):
timestamp()El método timestamp crea una columna equivalente a TIMESTAMP con una precisión opcional (dígitos totales):
timestampsTz()El método timestampsTz crea columnas created_at y updated_at equivalentes a TIMESTAMP (con zona horaria) con una precisión opcional (dígitos totales):
timestamps()El método timestamps crea columnas created_at y updated_at equivalentes a TIMESTAMP con una precisión opcional (dígitos totales):
tinyIncrements()El método tinyIncrements crea una columna equivalente a UNSIGNED TINYINT (clave principal y autoincremento):
tinyInteger()El método tinyInteger crea una columna equivalente a TINYINT:
tinyText()El método tinyText crea una columna equivalente a TINYTEXT:
unsignedBigInteger()El método unsignedBigInteger crea una columna equivalente a UNSIGNED BIGINT:
unsignedDecimal()El método unsignedDecimal crea una columna equivalente a UNSIGNED DECIMAL con una precisión opcional (dígitos totales) y escala (dígitos decimales):
unsignedInteger()El método unsignedInteger crea una columna equivalente a UNSIGNED INTEGER:
unsignedMediumInteger()El método unsignedMediumInteger crea una columna equivalente a UNSIGNED MEDIUMINT:
unsignedSmallInteger()El método unsignedSmallInteger crea una columna equivalente a UNSIGNED SMALLINT:
unsignedTinyInteger()El método unsignedTinyInteger crea una columna equivalente a UNSIGNED TINYINT:
ulidMorphs()El método ulidMorphs es un método de conveniencia que agrega una columna {column}_id equivalente a CHAR(26) y una columna {column}_type equivalente de tipo VARCHAR.
Este método está destinado a utilizarse al definir las columnas necesarias para una relación polimórfica de Eloquent que utiliza identificadores ULID. En el siguiente ejemplo, se crearían las columnas taggable_id y taggable_type:
uuidMorphs()El método uuidMorphs es un método de conveniencia que agrega una columna {column}_id equivalente a CHAR(36) y una columna {column}_type equivalente de tipo VARCHAR.
Este método está destinado a utilizarse al definir las columnas necesarias para una relación polimórfica de Eloquent que utiliza identificadores UUID. En el siguiente ejemplo, se crearían las columnas taggable_id y taggable_type:
ulid()El método ulid crea una columna equivalente a ULID:
uuid()El método uuid crea una columna equivalente a UUID:
year()El método year crea una columna equivalente a YEAR:
Además de los tipos de columna enumerados anteriormente, hay varios "modificadores" de columna que puede usar al agregar una columna a una tabla de base de datos. Por ejemplo, para hacer que la columna sea "anulable", puede usar el método nullable:
La siguiente tabla contiene todos los modificadores de columna disponibles. Esta lista no incluye modificadores de índice:
| Modificador | Descripción |
|---|---|
->after('column') |
Coloca la columna "después" de otra columna (MySQL). |
->autoIncrement() |
Establece columnas INTEGER como autoincrementables (clave principal). |
->charset('utf8mb4') |
Especifica un conjunto de caracteres para la columna (MySQL). |
->collation('utf8mb4_unicode_ci') |
Especifica una intercalación para la columna (MySQL/PostgreSQL/SQL Server). |
->comment('mi comentario') |
Agrega un comentario a una columna (MySQL/PostgreSQL). |
->default($value) |
Especifica un valor "predeterminado" para la columna. |
->first() |
Coloca la columna "primera" en la tabla (MySQL). |
->from($integer) |
Establece el valor de inicio de un campo de autoincremento (MySQL / PostgreSQL). |
->invisible() |
Hace que la columna sea "invisible" para las consultas SELECT * (MySQL). |
->nullable($value = true) |
Permite insertar valores NULL en la columna. |
->storedAs($expression) |
Crea una columna generada almacenada (MySQL / PostgreSQL). |
->unsigned() |
Establece columnas INTEGER como UNSIGNED (MySQL). |
->useCurrent() |
Establece columnas TIMESTAMP para usar CURRENT_TIMESTAMP como valor predeterminado. |
->useCurrentOnUpdate() |
Establece columnas TIMESTAMP para usar CURRENT_TIMESTAMP cuando se actualiza un registro (MySQL). |
->virtualAs($expression) |
Crea una columna generada virtual (MySQL / PostgreSQL / SQLite). |
->generatedAs($expression) |
Crea una columna de identidad con opciones de secuencia especificadas (PostgreSQL). |
->always() |
Define la precedencia de los valores de secuencia sobre la entrada para una columna de identidad (PostgreSQL). |
->isGeometry() |
Establece el tipo de columna espacial a geometry - el tipo predeterminado es geography (PostgreSQL). |
El modificador default acepta un valor o una instancia de Illuminate\Database\Query\Expression. El uso de una instancia de Expression evitará que Laravel envuelva el valor entre comillas y le permitirá utilizar funciones específicas de la base de datos. Una situación en la que esto es particularmente útil es cuando necesita asignar valores predeterminados a columnas JSON:
Advertencia El soporte para expresiones predeterminadas depende de su controlador de base de datos, la versión de la base de datos y el tipo de campo. Consulte la documentación de su base de datos.
Al utilizar la base de datos MySQL, el método after se puede utilizar para agregar columnas después de una columna existente en el esquema:
El método change le permite modificar el tipo y los atributos de columnas existentes. Por ejemplo, es posible que desee aumentar el tamaño de una columna string. Para ver el método change en acción, aumentemos el tamaño de la columna name de 25 a 50. Para lograr esto, simplemente definimos el nuevo estado de la columna y luego llamamos al método change:
Al modificar una columna, debe incluir explícitamente todos los modificadores que desee conservar en la definición de la columna; cualquier atributo faltante se eliminará. Por ejemplo, para conservar los atributos unsigned, default y comment, debe llamar a cada modificador explícitamente al cambiar la columna:
Si su aplicación utiliza una base de datos SQLite, debe instalar el paquete doctrine/dbal mediante el gestor de paquetes Composer antes de modificar una columna. La biblioteca Doctrine DBAL se utiliza para determinar el estado actual de la columna y para crear las consultas SQL necesarias para realizar los cambios solicitados en su columna:
Si planea modificar columnas creadas utilizando el método timestamp, también debe agregar la siguiente configuración al archivo de configuración config/database.php de su aplicación:
Advertencia Cuando se utiliza el paquete
doctrine/dbal, los siguientes tipos de columna se pueden modificar:bigInteger,binary,boolean,char,date,dateTime,dateTimeTz,decimal,double,integer,json,longText,mediumText,smallInteger,string,text,time,tinyText,unsignedBigInteger,unsignedInteger,unsignedSmallInteger,ulid, yuuid.
Para cambiar el nombre de una columna, puede utilizar el método renameColumn proporcionado por el generador de esquemas:
Si está ejecutando una instalación de base de datos anterior a una de las siguientes versiones, asegúrese de haber instalado la biblioteca doctrine/dbal mediante el gestor de paquetes Composer antes de cambiar el nombre de una columna:
8.0.310.5.23.25.0
Para eliminar una columna, puede utilizar el método dropColumn en el generador de esquemas:
Puede eliminar varias columnas de una tabla pasando un array de nombres de columna al método dropColumn:
Si está utilizando una versión de SQLite anterior a 3.35.0, debe instalar el paquete doctrine/dbal mediante el gestor de paquetes Composer antes de que se pueda utilizar el método dropColumn. No se admite la eliminación o modificación de varias columnas en una sola migración mientras se utiliza este paquete.
Laravel proporciona varios métodos convenientes relacionados con la eliminación de tipos comunes de columnas. Cada uno de estos métodos se describe en la siguiente tabla:
| Comando | Descripción |
|---|---|
$table->dropMorphs('morphable'); |
Elimina las columnas morphable_id y morphable_type. |
$table->dropRememberToken(); |
Elimina la columna remember_token. |
$table->dropSoftDeletes(); |
Elimina la columna deleted_at. |
$table->dropSoftDeletesTz(); |
Alias del método dropSoftDeletes(). |
$table->dropTimestamps(); |
Elimina las columnas created_at y updated_at. |
$table->dropTimestampsTz(); |
Alias del método dropTimestamps(). |
El generador de esquemas de Laravel admite varios tipos de índices. El siguiente ejemplo crea una nueva columna email y especifica que sus valores deben ser únicos. Para crear el índice, podemos encadenar el método unique en la definición de la columna:
Alternativamente, puede crear el índice después de definir la columna. Para hacerlo, debe llamar al método unique en el esquema del generador de esquemas. Este método acepta el nombre de la columna que debería recibir un índice único:
Incluso puede pasar un array de columnas a un método de índice para crear un índice compuesto:
Al crear un índice, Laravel generará automáticamente un nombre de índice basado en el nombre de la tabla, los nombres de columna y el tipo de índice, pero puede pasar un segundo argumento al método para especificar el nombre del índice usted mismo:
La clase blueprint del generador de esquemas de Laravel proporciona métodos para crear cada tipo de índice admitido por Laravel. Cada método de índice disponible acepta un segundo argumento opcional para especificar el nombre del índice. Si se omite, el nombre se derivará de los nombres de la tabla y columna(s) utilizados para el índice, así como el tipo de índice. Cada uno de los métodos de índice disponibles se describe en la siguiente tabla:
| Comando | Descripción |
|---|---|
$table->primary('id'); |
Añade una clave primaria. |
$table->primary(['id', 'parent_id']); |
Añade claves compuestas. |
$table->unique('email'); |
Añade un índice único. |
$table->index('state'); |
Añade un índice. |
$table->fullText('body'); |
Añade un índice de texto completo (MySQL/PostgreSQL). |
$table->fullText('body')->language('english'); |
Añade un índice de texto completo del idioma especificado (PostgreSQL). |
$table->spatialIndex('location'); |
Añade un índice espacial (excepto SQLite). |
Por defecto, Laravel utiliza el conjunto de caracteres utf8mb4. Si está ejecutando una versión de MySQL anterior a la versión 5.7.7 o MariaDB anterior a la versión 10.2.2, es posible que deba configurar manualmente la longitud predeterminada de cadena generada por las migraciones para que MySQL pueda crear índices para ellas. Puede configurar la longitud predeterminada de cadena llamando al método Schema::defaultStringLength dentro del método boot de su clase App\Providers\AppServiceProvider:
Alternativamente, puede habilitar la opción innodb_large_prefix para su base de datos. Consulte la documentación de su base de datos para obtener instrucciones sobre cómo habilitar correctamente esta opción.
Para cambiar el nombre de un índice, puede utilizar el método renameIndex proporcionado por el esquema del generador de esquemas. Este método acepta el nombre actual del índice como su primer argumento y el nombre deseado como su segundo argumento:
Advertencia Si su aplicación utiliza una base de datos SQLite, debe instalar el paquete
doctrine/dbala través del administrador de paquetes Composer antes de que se pueda usar el métodorenameIndex.
Para eliminar un índice, debe especificar el nombre del índice. Por defecto, Laravel asigna automáticamente un nombre de índice basado en el nombre de la tabla, el nombre de la columna indexada y el tipo de índice. Aquí hay algunos ejemplos:
| Comando | Descripción |
|---|---|
$table->dropPrimary('users_id_primary'); |
Elimina una clave primaria de la tabla "users". |
$table->dropUnique('users_email_unique'); |
Elimina un índice único de la tabla "users". |
$table->dropIndex('geo_state_index'); |
Elimina un índice básico de la tabla "geo". |
$table->dropFullText('posts_body_fulltext'); |
Elimina un índice de texto completo de la tabla "posts". |
$table->dropSpatialIndex('geo_location_spatialindex'); |
Eliminar un índice espacial de la tabla "geo" (excepto SQLite). |
Si pasa un array de columnas a un método que elimina índices, se generará el nombre de índice convencional basado en el nombre de la tabla, las columnas y el tipo de índice:
Laravel también brinda soporte para crear restricciones de clave externa que se utilizan para forzar la integridad referencial a nivel de base de datos. Por ejemplo, definamos una columna user_id en la tabla posts que haga referencia a la columna id en una tabla users:
Dado que esta sintaxis es bastante extensa, Laravel proporciona métodos adicionales más concisos que utilizan convenciones para ofrecer una mejor experiencia de desarrollo. Al utilizar el método foreignId para crear su columna, el ejemplo anterior se puede reescribir de la siguiente manera:
El método foreignId crea una columna equivalente a UNSIGNED BIGINT, mientras que el método constrained utilizará convenciones para determinar la tabla y la columna a la que se hace referencia. Si el nombre de su tabla no coincide con las convenciones de Laravel, puede proporcionarlo manualmente al método constrained. Además, también se puede especificar el nombre que se asignará al índice generado:
También puede especificar la acción deseada para las propiedades "on delete" y "on update" de la restricción:
También se proporciona una sintaxis alternativa y expresiva para estas acciones:
| Método | Descripción |
|---|---|
$table->cascadeOnUpdate(); |
Las actualizaciones deben cascada. |
$table->restrictOnUpdate(); |
Las actualizaciones deben restringirse. |
$table->cascadeOnDelete(); |
Las eliminaciones deben cascada. |
$table->restrictOnDelete(); |
Las eliminaciones deben restringirse. |
$table->nullOnDelete(); |
Las eliminaciones deben establecer el valor de la clave externa a nulo. |
Cualquier modificador de columna adicional debe llamarse antes del método constrained:
Para eliminar una clave externa, puede utilizar el método dropForeign, pasando el nombre de la restricción de clave externa que se va a eliminar como argumento. Las restricciones de clave externa utilizan la misma convención de nombres que los índices. En otras palabras, el nombre de la restricción de clave externa se basa en el nombre de la tabla y las columnas en la restricción, seguido por un sufijo "_foreign":
Alternativamente, puede pasar un array que contenga el nombre de la columna que tiene la clave externa al método dropForeign. El array se convertirá en un nombre de restricción de clave externa utilizando las convenciones de nombres de restricción de Laravel:
Puede habilitar o deshabilitar restricciones de clave externa dentro de sus migraciones utilizando los siguientes métodos:
Advertencia SQLite deshabilita las restricciones de clave externa de forma predeterminada. Cuando use SQLite, asegúrese de habilitar el soporte de claves externas en la configuración de su base de datos antes de intentar crearlas en sus migraciones. Además, SQLite solo admite claves externas al crear la tabla y no cuando se alteran las tablas.
Por conveniencia, cada operación de migración emitirá un evento. Todos los siguientes eventos extienden la clase base Illuminate\Database\Events\MigrationEvent:
| Clase | Descripción |
|---|---|
Illuminate\Database\Events\MigrationsStarted |
Se va a ejecutar un lote de migraciones. |
Illuminate\Database\Events\MigrationsEnded |
Se ha completado la ejecución de un lote de migraciones. |
Illuminate\Database\Events\MigrationStarted |
Se va a ejecutar una sola migración. |
Illuminate\Database\Events\MigrationEnded |
Se ha completado la ejecución de una sola migración. |
Illuminate\Database\Events\SchemaDumped |
Se ha completado un volcado del esquema de la base de datos. |
Illuminate\Database\Events\SchemaLoaded |
Se ha cargado un volcado existente del esquema de la base de datos. |
Labore dolor amet ipsum ea, erat sit ipsum duo eos. Volup amet ea dolor et magna dolor, elitr rebum duo est sed diam elitr. Stet elitr stet diam duo eos rebum ipsum diam ipsum elitr.
123 Street, New York, USA
info@example.com
+012 345 67890
©
Your Site Name.
All Rights Reserved.
Designed by
HTML Codex
Distributed By:
ThemeWagon