# MigrationsBundle - [Installation](#installation) - [Class](#class) - [Execution](#Execution) - [Example YAML](#Example YAML) ## Installation **composer.json**: ```javascript "repositories": [ { "type": "vcs", "url": "ssh://git@bitbucket.org/ikflowdat/migrations.git" } ], "require": { "ik/migrations-bundle": "dev-master" }, ``` **app/AppKernel.php**: ```php public function registerBundles() { $bundles = [ new MigrationsBundle\MigrationsBundle() ]; . . } ``` ## Class - **MigrationsBundle\MigrationsBase**: Clase de la cual se debe extender para poder hacer migraciones interpretando un yaml. Esta clase proporciona los siguientes métodos que se ejecutan en el siguiente orden: ```Php 1- preUp: se utiliza para validaciones y sentencias DML. 2- up: se utiliza principalmente para sentencias DDL. 3- postUp: se utiliza para validaciones y sentencias DML. 4- preDown: se utiliza para validaciones y sentencias DML. 5- down: se utiliza principalmente para sentencias DDL. 6- postDown: se utiliza para validaciones y sentencias DML. ``` Ademas se pueden utilizar las siguientes funciones: ```Php * deleteMigrationsVersion: Borra la versión de la tabla de migraciones para que no tire error. Esto se utiliza en caso de que se deba correr varias veces la misma migración. Se debe incluir en la función "preUp". Recibe como parámetro el objeto de ejecución ($this). * executeSQL: Ejecuta un sql en al base de datos. Recibe como parámetros el sql, el tipo de sentencia (INSERT/ UPDATE/DELETE) y un array con los valores a reemplazar en el sql. * executeYaml: Ingresa los valores desde un archivo yaml. Se toma como base el directorio app/DoctrineMigrations/ Recibe como parámetro el nombre del archivo a incorporar. * existFieldInTable: Verifica si existe un campo dentro de una tabla. Recibe como parámetro el nombre de la tabla y el nombre del campo. * existFieldType: Verifica si existe un campo con un cierto tipo de dato dentro de una tabla. Recibe como parámetro el nombre de la tabla, el nombre del campo y el tipo de dato. * existTable: Verifica si existe una tabla. Recibe como parámetro el nombre de la tabla. * existValueInTable: Verifica si existe un valor en la tabla. Recibe como parámetro el nombre de la tabla, el nombre del campo y el valor a buscar. * getAutoIncrementValue: Retorna el valor del auto_increment de una tabla. Recibe como parámetro el nombre de la tabla. * getDataBaseName: Retorna el nombre de la base a la cual estoy conectado. * getMigrationNumber: Función que obtiene el número de migración que estoy ejecutantdo. Recibe como parámetro el objeto de ejecución ($this). * setAutoIncrementValue: Setea el valor del auto_increment de una tabla. Recibe como parámetro el nombre de la tabla y valor a setear. * setShowParameters: Se utiliza para mostrar los parámetros de cada una de las sentencias sql. Recibe como parámetro un TRUE/FALSE. * showResult: Se encarga de mostrar como se ejecuto cada uno de las sentencias sql. No recibe parámetros. * verifyMigrationsVersion: Verifica si la migración ya se incorporó. Recibe como parámetro el objeto de ejecución ($this). ``` ## Execution Una versión ```bash $ bin/console doctrine:migrations:execute ``` Todas las versiones ```bash $ bin/console doctrine:migrations:migrate ``` ## Example YAML **Palabras claves de importación**: son palabras que importan los datos desde otros archivos que pueden estar en otros directorios. Siempre se toma como base `app/DoctrineMigrations`. ``` import: importa el valor de un campo de un registro. importKey: importa un registro completo. Este archivo puede contener la palabra clave "import". ``` **Ejemplo completo** `datosAIncorporar.yml` ```yaml insert: groups: # nombre de la tabla - id: 1 # registro 1 name: Admin 1 roles: rol 1 ignore: true orupdate: true - id: 2 # registro 2 name: {import: "insertSoloName.yml"} replace: 1 roles: rol 2 - {importkey: "insertCompleto.yml"} # registro 3 - {importkey: "insertCompletoAnidado.yml"} # registro 4 update: # nombre de la tabla groups: - name: "Admin update 1" # registro 1 where: id = 1 - where: id = 2 name: {import: "updateSoloName.yml"} # registro 2 - {importkey: "updateCompleto.yml"} # registro 3 - {importkey: "updateCompletoAnidado.yml"} # registro 4 delete: # nombre de la tabla groups: - where: id = 1 # registro 1 - where: {import: "deleteSoloWhere.yml"} # registro 2 - {importkey: "deleteCompleto.yml"} # registro 3 - {importkey: "deleteCompletoAnidado.yml"} # registro 4 ``` **_Explicación de cada uno de las sentencias_** **INSERT**: El "replace" sobrescribe al "ignore" y el "orupdate" sobrescribe al "replace". ```Php palabras claves: orupdate: crea un "insert ... or update ...". Si el registro no existe lo inserta, en caso contrario hace un update de los datos. replace: crea un "replace into ...". ignore: crea un "insert ignore into ...". ``` Archivo base de incorporación: `datosAIncorporar.yml` ```yaml insert: groups: # nombre de la tabla - id: 1 # registro 1 name: Admin 1 roles: rol 1 ignore: true orupdate: true - id: 2 # registro 2 name: {import: "insertSoloName.yml"} replace: 1 roles: rol 2 - {importkey: "insertCompleto.yml"} # registro 3 - {importkey: "insertCompletoAnidado.yml"} # registro 4 ``` Archivo que contiene solo el valor del campo name: `insertSoloName.yml` ```yaml Admin 2 ``` Archivo que contiene la estructura de un insert: `insertCompleto.yml` ```yaml id: 3 name: "Admin 3" roles: rol 3 ``` Archivo que contiene la estructura de un insert y se anida en 1 profundidad: `insertCompletoAnidado.yml` ```yaml id: 4 name: {import: "insertCompletoAnidadoSoloName.yml"} roles: rol 4 ignore: 1 ``` **UPDATE**: tiene la particularidad de que el where se debe escribir completo. Archivo base de incorporación: `datosAIncorporar.yml` ```yaml update: groups: # nombre de la tabla - name: "Admin update 1" # registro 1 where: id = 1 - where: id = 2 # registro 2 name: {import: "updateSoloName.yml"} - {importkey: "updateCompleto.yml"} # registro 3 - {importkey: "updateCompletoAnidado.yml"} # registro 4 ``` Archivo que contiene solo el valor del campo name: `updateSoloName.yml` ```yaml Admin update 222222 ``` Archivo que contiene la estructura de un update: `updateCompleto.yml` ```yaml where: id = 3 name: "Admin update 3" ``` Archivo que contiene la estructura de un udpate y se anida en 1 profundidad: `updateCompletoAnidado.yml` ```yaml where: id = 4 name: {import: "updateCompletoAnidadoSoloName.yml"} ``` **DELETE**: tiene la particularidad de que el where se debe escribir completo. Archivo base de incorporación: `datosAIncorporar.yml` ```yaml delete: groups: # nombre de la tabla - where: id = 1 # registro 1 - where: {import: "deleteSoloWhere.yml"} # registro 2 - {importkey: "deleteCompleto.yml"} # registro 3 - {importkey: "deleteCompletoAnidado.yml"} # registro 4 ``` Archivo que contiene solo el valor del campo name: `deleteSoloWhere.yml` ```yaml id = 2 ``` Archivo que contiene la estructura de un delete: `deleteCompleto.yml` ```yaml where: id = 3 ``` Archivo que contiene la estructura de un delete y se anida en 1 profundidad: `deleteCompletoAnidado.yml` ```yaml where: {import: "deleteCompletoAnidadoWhere.yml"} ```