El ORM PIPE permite la gestión de DDL (Lenguaje de Definición de Datos) por medio de migraciones.
#1 Creación de tabla.
<?php
use PIPE\Migracion\Atributo;
use PIPE\Migracion\Migracion;
Migracion::tabla('telefonos')
->enteroGrande('id', (new Atributo)->sinSigno()->autoincrementable()->llavePrimaria())
->cadena('numero', 20, (new Atributo)->noNulo())
->marcaTiempo('creado_en', (new Atributo)->nulo())
->marcaTiempo('actualizado_en', (new Atributo)->nulo())
->marcaTiempo('eliminado_en', (new Atributo)->nulo())
->crearTabla();
Migracion::tabla('usuarios')
->enteroGrande('id', (new Atributo)->sinSigno()->autoincrementable())
->enteroGrande('telefono_id', (new Atributo)->sinSigno())
->cadena('nombres', 255, (new Atributo)->noNulo())
->cadena('apellidos', 255, (new Atributo)->noNulo())
->cadena('estado', 8, (new Atributo)->chequeo("estado IN ('activo', 'inactivo')"))
->enumerado('verificado', ['SÍ', 'NO'], (new Atributo)->predeterminado('NO'))
->personalizado('fecha_nacimiento DATE CHECK (fecha_nacimiento <= CURRENT_DATE())')
->marcaTiempo('creado_en', (new Atributo)->nulo())
->marcaTiempo('actualizado_en', (new Atributo)->nulo())
->marcaTiempo('eliminado_en', (new Atributo)->nulo())
->restriccion('llave_primaria_id')
->llavePrimaria('id') // Permite enviar un arreglo de llaves primarias.
->restriccion('llave_foranea_telefono_id')
->llaveForanea('telefono_id', 'telefonos', 'id', Atributo::RESTRICCION, Atributo::CASCADA)
->crearTabla(true); // Al enviar el parámetro true, indicamos (CREATE TABLE IF NOT EXISTS).
#2 Borrado de tabla.
<?php
use PIPE\Migracion\Migracion;
Migracion::tabla('usuarios')->borrarTabla();
// Al enviar el primer parámetro true, indicamos (DROP TABLE IF EXISTS).
Migracion::tabla('usuarios')->borrarTabla(true);
// Al enviar el segundo parámetro true, indicamos el borrado en cascada (CASCADE).
Migracion::tabla('usuarios')->borrarTabla(true, true);
// Podemos eliminar varias tablas de la siguiente manera.
Migracion::tabla(['usuarios', 'telefonos'])->borrarTabla();
#3 Creación de índice.
<?php
use PIPE\Migracion\Migracion;
Migracion::tabla('usuarios')->crearIndice('nombres');
// Podemos definir el nombre del índice de la siguiente manera.
Migracion::tabla('usuarios')->crearIndice('nombres', 'indice_nombres');
// Podemos crear índices a varios campos de la siguiente manera.
Migracion::tabla('usuarios')->crearIndice(['nombres', 'apellidos']);
#4 Creación de índice único.
<?php
use PIPE\Migracion\Migracion;
Migracion::tabla('usuarios')->crearIndiceUnico('nombres');
// Podemos definir el nombre del índice único de la siguiente manera.
Migracion::tabla('usuarios')->crearIndiceUnico('nombres', 'indice_unico_nombres');
// Podemos crear índices únicos a varios campos de la siguiente manera.
Migracion::tabla('usuarios')->crearIndiceUnico(['nombres', 'apellidos']);
#5 Borrado de índice.
<?php
use PIPE\Migracion\Migracion;
Migracion::tabla('usuarios')->borrarIndice('indice_unico_nombres');
#6 Borrado de restricción.
<?php
use PIPE\Migracion\Migracion;
Migracion::tabla('usuarios')->borrarRestriccion('llave_foranea_telefono_id');
// Al enviar el segundo parámetro true, indicamos (DROP CONSTRAINT IF EXISTS).
Migracion::tabla('usuarios')->borrarRestriccion('llave_foranea_telefono_id', true);
// Al enviar el tercer parámetro true, indicamos el borrado en cascada (CASCADE).
Migracion::tabla('usuarios')->borrarRestriccion('llave_foranea_telefono_id', true, true);
#7 Creación de llave primaria.
<?php
use PIPE\Migracion\Migracion;
Migracion::tabla('usuarios')->crearLlavePrimaria('id');
// Podemos definir el nombre de la restricción de la siguiente manera.
Migracion::tabla('usuarios')->crearLlavePrimaria('id', 'llave_primaria_id');
// Podemos crear la llave primaria con campos combinados de la siguiente manera.
Migracion::tabla('usuarios')->crearLlavePrimaria(['id', 'codigo']);
#8 Borrado de llave primaria.
<?php
use PIPE\Migracion\Migracion;
Migracion::tabla('usuarios')->borrarLlavePrimaria();
#9 Creación de llave foránea.
<?php
use PIPE\Migracion\Atributo;
use PIPE\Migracion\Migracion;
Migracion::tabla('usuarios')->crearLlaveForanea('telefono_id', 'telefonos', 'id', 'llave_foranea_telefono_id', Atributo::RESTRICCION, Atributo::CASCADA);
#10 Borrado de llave foránea.
<?php
use PIPE\Migracion\Migracion;
Migracion::tabla('usuarios')->borrarLlaveForanea('llave_foranea_telefono_id');
#11 Creación de campo.
<?php
use PIPE\Migracion\Atributo;
use PIPE\Migracion\Migracion;
Migracion::tabla('usuarios')->crearCampo('apodo', Atributo::CADENA, (new Atributo)->nulo());
// Podemos definir la longitud del campo de la siguiente manera.
Migracion::tabla('usuarios')->crearCampo('apodo', Atributo::CADENA, (new Atributo)->nulo(), 255);
// En MySQL, podemos ubicar el campo de primero de la siguiente manera.
Migracion::tabla('usuarios')->crearCampo('apodo', Atributo::CADENA, (new Atributo)->nulo(), 255, true);
// En MySQL, también podemos ubicarlo después de un campo definido de la siguiente manera.
Migracion::tabla('usuarios')->crearCampo('apodo', Atributo::CADENA, (new Atributo)->nulo(), 255, 'nombres');
#12 Cambio de campo.
<?php
use PIPE\Migracion\Atributo;
use PIPE\Migracion\Migracion;
Migracion::tabla('usuarios')->cambiarCampo('apodo', 'nombre_pila', Atributo::CADENA, (new Atributo)->noNulo(), 100);
#13 Borrado de campo.
<?php
use PIPE\Migracion\Migracion;
Migracion::tabla('usuarios')->borrarCampo('nombre_pila');
A continuación, se presenta un listado de los 63 métodos disponibles en la clase Migracion para la gestión de DDL en los motores de base de datos MySQL, PostgreSQL, SQLite y SQL Server.
| Método | Tipo de dato | MySQL | PostgreSQL | SQLite | SQL Server |
|---|---|---|---|---|---|
| - | Soporte | ||||
| borrarCampo() | - | ✅ | ✅ | ✅ | ✅ |
| borrarIndice() | - | ✅ | ✅ | ✅ | ✅ |
| borrarLlaveForanea() | - | ✅ | ✅ | ✅ | ✅ |
| borrarLlavePrimaria() | - | ✅ | ✅ | ✅ | ✅ |
| borrarRestriccion() | - | ✅ | ✅ | ✅ | ✅ |
| borrarTabla() | - | ✅ | ✅ | ✅ | ✅ |
| cambiarCampo() | - | ✅ | ✅ | ✅ | ✅ |
| crearCampo() | - | ✅ | ✅ | ✅ | ✅ |
| crearIndice() | - | ✅ | ✅ | ✅ | ✅ |
| crearIndiceUnico() | - | ✅ | ✅ | ✅ | ✅ |
| crearLlaveForanea() | - | ✅ | ✅ | ✅ | ✅ |
| crearLlavePrimaria() | - | ✅ | ✅ | ✅ | ✅ |
| crearTabla() | - | ✅ | ✅ | ✅ | ✅ |
| espacioTabla() | - | ❌ | ✅ | ❌ | ❌ |
| llaveForanea() | - | ✅ | ✅ | ✅ | ✅ |
| llavePrimaria() | - | ✅ | ✅ | ✅ | ✅ |
| motor() | - | ✅ | ❌ | ❌ | ❌ |
| personalizado() | - | ✅ | ✅ | ✅ | ✅ |
| restriccion() | - | ✅ | ✅ | ✅ | ✅ |
| tabla() | - | ✅ | ✅ | ✅ | ✅ |
| Enteros | Soporte | ||||
| enteroMuyPequeno() | TYNYINT | ✅ | ❌ | ❌ | ✅ |
| enteroPequeno() | SMALLINT | ✅ | ✅ | ❌ | ✅ |
| enteroMediano() | MEDIUMINT | ✅ | ❌ | ❌ | ❌ |
| entero() | INT / INTEGER | ✅ | ✅ | ✅ | ✅ |
| enteroGrande() | BIGINT | ✅ | ✅ | ❌ | ✅ |
| serialPequeno() | SMALLSERIAL | ❌ | ✅ | ❌ | ❌ |
| serial() | SERIAL | ❌ | ✅ | ❌ | ❌ |
| serialGrande() | BIGSERIAL | ❌ | ✅ | ❌ | ❌ |
| Decimales | Soporte | ||||
| decimal() | DECIMAL(p,s) | ✅ | ✅ | ✅ | ✅ |
| numerico() | NUMERIC(p,s) | ✅ | ✅ | ✅ | ✅ |
| flotante() | FLOAT | ✅ | ✅ | ✅ | ✅ |
| doble() | DOUBLE | ✅ | ✅ | ✅ | ✅ |
| doblePrecision() | DOUBLE PRECISION | ✅ | ✅ | ❌ | ❌ |
| real() | REAL | ✅ | ✅ | ✅ | ✅ |
| monetario() | MONEY | ❌ | ❌ | ❌ | ✅ |
| monetarioPequeno() | SMALLMONEY | ❌ | ❌ | ❌ | ✅ |
| Cadenas de texto | Soporte | ||||
| caracter() | CHAR(n) | ✅ | ✅ | ✅ | ✅ |
| cadena() | VARCHAR(n) | ✅ | ✅ | ✅ | ✅ |
| nCaracter() | NCHAR(n) | ❌ | ❌ | ❌ | ✅ |
| nCadena() | NVARCHAR(n) | ❌ | ❌ | ❌ | ✅ |
| textoMuyPequeno() | TINYTEXT | ✅ | ❌ | ❌ | ❌ |
| textoMediano() | MEDIUMTEXT | ✅ | ❌ | ❌ | ❌ |
| texto() | TEXT | ✅ | ✅ | ✅ | ✅ |
| textoLargo() | LONGTEXT | ✅ | ❌ | ❌ | ❌ |
| Marcas de tiempo | Soporte | ||||
| fecha() | DATE | ✅ | ✅ | ✅ | ✅ |
| fechaHora() | DATETIME | ✅ | ❌ | ✅ | ✅ |
| fechaHora2() | DATETIME2 | ❌ | ❌ | ❌ | ✅ |
| marcaTiempo() | TIMESTAMP | ✅ | ✅ | ✅ | ✅ |
| hora() | TIME | ✅ | ✅ | ✅ | ✅ |
| anio() | YEAR | ✅ | ❌ | ❌ | ❌ |
| Lógicos | Soporte | ||||
| booleano() | BOOLEAN | ✅ | ✅ | ✅ | ✅ |
| digitoBinario() | BIT | ❌ | ❌ | ❌ | ✅ |
| Binarios | Soporte | ||||
| binario() | BINARY(n) | ✅ | ✅ | ❌ | ✅ |
| binarioVariable() | VARBINARY(n) | ✅ | ✅ | ❌ | ✅ |
| binarioGrande() | BLOB | ✅ | ✅ | ✅ | ✅ |
| binarioMatriz() | BYTEA | ❌ | ✅ | ❌ | ❌ |
| Geométricos | Soporte | ||||
| coordenada() | POINT | ✅ | ✅ | ❌ | ❌ |
| coordenadaLinea() | LINESTRING | ✅ | ✅ | ❌ | ❌ |
| poligono() | POLYGON | ✅ | ✅ | ❌ | ❌ |
| Otros | Soporte | ||||
| enumerado() | ENUM(n...) | ✅ | ✅ | ❌ | ✅ |
| conjunto() | SET(n...) | ✅ | ❌ | ❌ | ❌ |
| json() | JSON | ✅ | ✅ | ❌ | ✅ |
| jsonb() | JSONB | ❌ | ✅ | ❌ | ❌ |
A continuación, se presenta un listado de los 10 métodos disponibles en la clase Atributo para la gestión de DDL en los motores de base de datos MySQL, PostgreSQL, SQLite y SQL Server.
| Método | Atributo | MySQL | PostgreSQL | SQLite | SQL Server |
|---|---|---|---|---|---|
| - | Soporte | ||||
| autoincrementable() | AUTO_INCREMENT / GENERATED BY DEFAULT AS IDENTITY / AUTOINCREMENT / IDENTITY | ✅ | ✅ | ✅ | ✅ |
| chequeo() | CHECK | ✅ | ✅ | ✅ | ✅ |
| cotejamiento() | COLLATE | ✅ | ✅ | ✅ | ✅ |
| identidad() | IDENTITY | ❌ | ❌ | ❌ | ✅ |
| llavePrimaria() | PRIMARY KEY | ✅ | ✅ | ✅ | ✅ |
| noNulo() | NOT NULL | ✅ | ✅ | ✅ | ✅ |
| nulo() | NULL | ✅ | ✅ | ✅ | ✅ |
| predeterminado() | DEFAULT | ✅ | ✅ | ✅ | ✅ |
| sinSigno() | UNSIGNED | ✅ | ❌ | ❌ | ❌ |
| unico() | UNIQUE | ✅ | ✅ | ✅ | ✅ |
A continuación, se presenta un listado de las 48 constantes disponibles en la clase Atributo para la gestión de DDL en los motores de base de datos MySQL, PostgreSQL, SQLite y SQL Server.
| Constante | Tipo de dato | MySQL | PostgreSQL | SQLite | SQL Server |
|---|---|---|---|---|---|
| Enteros | Soporte | ||||
| Atributo::ENTERO_MUY_PEQUENO | TYNYINT | ✅ | ❌ | ❌ | ✅ |
| Atributo::ENTERO_PEQUENO | SMALLINT | ✅ | ✅ | ❌ | ✅ |
| Atributo::ENTERO_MEDIANO | MEDIUMINT | ✅ | ❌ | ❌ | ❌ |
| Atributo::ENTERO | INT / INTEGER | ✅ | ✅ | ✅ | ✅ |
| Atributo::ENTERO_GRANDE | BIGINT | ✅ | ✅ | ❌ | ✅ |
| Atributo::SERIAL_PEQUENO | SMALLSERIAL | ❌ | ✅ | ❌ | ❌ |
| Atributo::SERIAL | SERIAL | ❌ | ✅ | ❌ | ❌ |
| Atributo::SERIAL_GRANDE | BIGSERIAL | ❌ | ✅ | ❌ | ❌ |
| Decimales | Soporte | ||||
| Atributo::DECIMAL | DECIMAL(p,s) | ✅ | ✅ | ✅ | ✅ |
| Atributo::NUMERICO | NUMERIC(p,s) | ✅ | ✅ | ✅ | ✅ |
| Atributo::FLOTANTE | FLOAT | ✅ | ✅ | ✅ | ✅ |
| Atributo::DOBLE | DOUBLE | ✅ | ✅ | ✅ | ✅ |
| Atributo::DOBLE_PRECISION | DOUBLE PRECISION | ✅ | ✅ | ❌ | ❌ |
| Atributo::REAL | REAL | ✅ | ✅ | ✅ | ✅ |
| Atributo::MONETARIO | MONEY | ❌ | ❌ | ❌ | ✅ |
| Atributo::MONETARIO_PEQUENO | SMALLMONEY | ❌ | ❌ | ❌ | ✅ |
| Cadenas de texto | Soporte | ||||
| Atributo::CARACTER | CHAR(n) | ✅ | ✅ | ✅ | ✅ |
| Atributo::CADENA | VARCHAR(n) | ✅ | ✅ | ✅ | ✅ |
| Atributo::N_CARACTER | NCHAR(n) | ❌ | ❌ | ❌ | ✅ |
| Atributo::N_CADENA | NVARCHAR(n) | ❌ | ❌ | ❌ | ✅ |
| Atributo::TEXTO_MUY_PEQUENO | TINYTEXT | ✅ | ❌ | ❌ | ❌ |
| Atributo::TEXTO_MEDIANO | MEDIUMTEXT | ✅ | ❌ | ❌ | ❌ |
| Atributo::TEXTO | TEXT | ✅ | ✅ | ✅ | ✅ |
| Atributo::TEXTO_LARGO | LONGTEXT | ✅ | ❌ | ❌ | ❌ |
| Marcas de tiempo | Soporte | ||||
| Atributo::FECHA | DATE | ✅ | ✅ | ✅ | ✅ |
| Atributo::FECHA_HORA | DATETIME | ✅ | ❌ | ✅ | ✅ |
| Atributo::FECHA_HORA_2 | DATETIME2 | ❌ | ❌ | ❌ | ✅ |
| Atributo::MARCA_TIEMPO | TIMESTAMP | ✅ | ✅ | ✅ | ✅ |
| Atributo::HORA | TIME | ✅ | ✅ | ✅ | ✅ |
| Atributo::ANIO | YEAR | ✅ | ❌ | ❌ | ❌ |
| Lógicos | Soporte | ||||
| Atributo::BOOLEANO | BOOLEAN | ✅ | ✅ | ✅ | ✅ |
| Atributo::DIGITO_BINARIO | BIT | ❌ | ❌ | ❌ | ✅ |
| Binarios | Soporte | ||||
| Atributo::BINARIO | BINARY(n) | ✅ | ✅ | ❌ | ✅ |
| Atributo::BINARIO_VARIABLE | VARBINARY(n) | ✅ | ✅ | ❌ | ✅ |
| Atributo::BINARIO_GRANDE | BLOB | ✅ | ✅ | ✅ | ✅ |
| Atributo::BINARIO_MATRIZ | BYTEA | ❌ | ✅ | ❌ | ❌ |
| Geométricos | Soporte | ||||
| Atributo::COORDENADA | POINT | ✅ | ✅ | ❌ | ❌ |
| Atributo::COORDENADA_LINEA | LINESTRING | ✅ | ✅ | ❌ | ❌ |
| Atributo::POLIGONO | POLYGON | ✅ | ✅ | ❌ | ❌ |
| Otros | Soporte | ||||
| Atributo::ENUMERADO | ENUM(n...) | ✅ | ✅ | ❌ | ✅ |
| Atributo::CONJUNTO | SET(n...) | ✅ | ❌ | ❌ | ❌ |
| Atributo::JSON | JSON | ✅ | ✅ | ❌ | ✅ |
| Atributo::JSONB | JSONB | ❌ | ✅ | ❌ | ❌ |
| Atributo::CASCADA | CASCADE | ✅ | ✅ | ✅ | ✅ |
| Atributo::NULO | SET NULL | ✅ | ✅ | ✅ | ✅ |
| Atributo::PREDETERMINADO | SET DEFAULT | ✅ | ✅ | ✅ | ✅ |
| Atributo::NO_ACCION | NO ACTION | ✅ | ✅ | ✅ | ✅ |
| Atributo::RESTRICCION | RESTRICT | ✅ | ✅ | ✅ | ✅ |
Si utilizas el Modelo para interactuar con los datos de la base de datos, tendrás la ventaja de poder omitir las convenciones que tiene el ORM PIPE y adaptarse a la estructura que tenga tu tabla en la base de datos, ya que el Constructor de Consultas se adapta por defecto a las convenciones.