Ejemplo para crear migraciones con llaves foráneas

Ejemplo para crear migraciones con llaves foráneas

Ultima Actualización: 04-Marzo-2024

En el siguiente ejemplo vamos a crear 3 tablas que contiene llaves foráneas.

Este ejemplo se realizó con las siguientes características: 

Yii2 version: 2.0.14
PHP Versión: 7.3.5
Maria SQL: 10.1.39-MariaD

Nota importante. Este ejemplo sólo funcionará a partir la versión 2.0.6 de Yii2.






Paso 1

Crea un archivo para una nueva migración


Para crear un archivo nuevo para la migración puedes hacerlo entrando a la ruta del proyecto vía línea de comando y ejecuta el siguiente comando para crear la migración en la ruta raíz del proyecto. 


yii migrate/create ejemplo_migracion_tutorialesyii2

Una vez que has introducido ésto te preguntará si deseas crear la migración y deberás de escribir "yes".

Una vez que has creado la migración, si todo salió bien deberás de poder ver un archivo dentro de tu proyecto con le mismo nombre que le has puesto, agregando unos números, ejemplo: 


"m200303_181948_create ejemplo_migracion_tutorialesyii2"

Si puedes ver el archivo entonces puedes continuar.

Paso # 2



Creando tablas.

El siguiente paso es identificar las tablas que vas a crear y sus llaves foráneas, para éste ejemplo favor de hacer referencia a la primer imagen: 

Vamos a agregas las tablas con los siguientes nombres:

  • servidor
  • log
  • tipo_log
Ahora bien, tenemos que identificar el método "SafeUp()" que es el método utilizado para agregar la migración correspondiente, por lo que la clase nueva deberá lucir de la siguiente manera: 


<?php

use yii\db\Migration;

/**
 * Class m200303_181948_ejemplo_migracion_tutorialesyii2
 */
class m200303_181948_ejemplo_migracion_tutorialesyii2 extends Migration
{
    /**
     * {@inheritdoc}
     */
    public function safeUp()
    {

    }

    /**
     * {@inheritdoc}
     */
    public function safeDown()
    {
        echo "m200303_181948_ejemplo_migracion_tutorialesyii cannot be reverted.\n";

        return false;
    }

    /*
    // Use up()/down() to run migration code without a transaction.
    public function up()
    {

    }

    public function down()
    {
        echo "m200303_181948_ejemplo_migracion_tutorialesyii cannot be reverted.\n";

        return false;
    }
    */
}


Te recomiendo primer crear las tablas desde el nivel más alto, es decir la que contenga el origen de las llaves foráneas y posteriormente las tablas que utilizan las llaves foráneas, tal como lo harías si crearas las tablas con cualquier aplicación para administrar tablas. 

La primera tabla que vamos a crear para el siguiente ejemplo es la de "servidor", por lo tanto debes agregarla dentro del método "safeUp()" como se muestra a continuación.


$this->createTable('servidor', [
            'id' => $this->primaryKey()->notNull(),
            'host' => $this->string(255)
        ],
       'ENGINE InnoDB'
);


Donde el primer parámetro es el nombre de la tabla que en este caso es "servidor", después le sigue un arreglo donde se deben de escribir todos los campos de la tabla, dependiendo del tipo varian algunas cosas, ejemplo: 

Crear un campo índice sería: 


'id' => $this->primaryKey()->notNull(),


Donde el nombre del id es el valor de la izquierda.

Ejemplo de un campo de tipo "String" con 225 espacios.


'host' => $this->string(255)


Si juntamos todo quedaría así, y si ejecutáramos ese ejemplo sólo crearía una tabla, pero queremos crear más tablas por lo tanto aun no terminado.


  public function safeUp()
    {
         $this->createTable('servidor', [
            'id' => $this->primaryKey()->notNull(),
            'host' => $this->string(255)
        ],
        'ENGINE InnoDB'
       );
    }



De manera opcional se puede colocar el nombre del motor a utilizar en la tabla. 

   
 'ENGINE InnoDB'

De igual manera creamos la segunda tabla:


        $this->createTable('tipo_log', [
            'id' => $this->primaryKey()->notNull(),
            'nombre' => $this->string(255)
        ]);

Y de la misma forma pero añadiendo más campos quedaría así:


      $this->createTable('log', [    
            'id' => $this->primaryKey(),
            'tipo_log_id' =>  $this->integer()->notNull(),
            'servidor_id' => $this->integer()->notNull(),
            'fecha' => $this->string(255),
            'origen' => $this->string(255),
            'proceso' => $this->string(255),
            'detalle' => $this->text(),
            'creado'=> $this->dateTime()->notNull()            
        ]
       'ENGINE InnoDB'
       );


Observa que hemos agregado dos nuevos tipos de campos "text()", "dateTime()" y la función "notNull() " es utilizada para indicar que son campos requeridos en la base de datos. 

Creando llaves foráneas 

Las llaves foráneas requieren que el campo origen sea de tipo "primaryKey()" solo debes verificar eso, y a continuación muestro un ejemplo de cómo crear la primera llave foránea. 


        $this->addForeignKey(
                'fk_servidorId', 
                'log', 
                'servidor_id',
                'servidor',
                'id',
                'CASCADE'
                );


Explicaré cada unos de los parámetros en orden de aparición.

Parámetros:

  1. Nombre de la llave foránea: Esta puede ser cualquier nombre pero yo te recomendaría utilizar el prefijo "fk" seguida de guión bajo y el nombre de la tabla origen seguido del nombre del campo que contiene la llave primaria, en este caso yo le puse  'fk_servidorId'.
  2. Nombre de la tabla a quien se le aplicará la llave foránea: Las llaves foráneas se guardan en la tabla donde se inserta el campo, por lo tanto como lo muestra la imagen la tabla que contiene la llave foránea es la tabla "log".
  3. Nombre del campo de la llave foránea: Es la cual se liga la llave foránea, recuerda que el campo puede existir pero puede o no ser llave foránea, éste parámetro es el que indica el campo que llevará el campo de la llave, en este caso es:  'servidor_id'.
  4. Tabla origen de la llave foránea: Es la tabla origen de donde procede la llave foránea en este caso es "servidor" como lo muestra la imagen. 
  5. Nombre del campo del origen de la llave foránea: En este caso el campo origen se llama "id".
  6. Opcion de borrar en cascada: Esta opción es opcional y funciona para agregar la opción de borrar en cascada. 

La segunda llave foránea se repite el mismo proceso. 


        $this->addForeignKey(
                'fk_TipoLog',
                'log',
                'tipo_log_id',
                'tipo_log',
                'id',
                'CASCADE'
                );


Para saber más acerca de las migraciones consulta el siguiente link


Comentarios

Aprende Yii2


Lo más Visto

Guía rápida para uso de widget kartik para select para formulario

Cómo incluir una vista dentro de un modal

Tutorial de implementación de calendario de rango de fechas con Karkit en gridView

Google Plus desaparecerá el 4 de Abril de 2019

Crear fomulario HTML con checkbox sin Active Record

hostinger

ventana bienvenida