Base de datos y migraciones (Migrations)

Migraciones nos permite diseñar la estructura de nuestra base de datos y mantener su historial de cambios a lo largo del desarrollo del proyecto. Normalmente los programadores crean tablas y columnas dentro de una base de dato usando lenguaje SQL o utilizando PHPMyAdmin, este proceso de tener que diseñar, crear y llevar el control de la base de datos solía resultar bastante tedioso, es aquí que migraciones nos facilita el proceso.

Las migraciones son un mecanismo proporcionado por Laravel con el que podemos tener una especie de control de versiones sobre los cambios en la estructura de nuestra base de dato. Las migraciones al crear un esquema, las migraciones crearán las tablas para el motor de base de datos que tengamos configurado.

Por defecto las migraciones se encuentran en el directorio database/migrations cada migración es un archivo .php que incluye en el nombre del archivo la fecha y la hora que fue creada (en formato timestamp) y el nombre de la migración.

Migraciones por defecto

Al crear un proyecto nuevo de Laravel, Laravel incluye por defecto dos migraciones:

  • 2014_10_12_000000_create_users_table.php
  • 2014_10_12_100000_create_password_resets_table.php

Una migración no es mas que una clase de PHP que extiende de la clase Migration el nombre de la clase corresponde al nombre del archivo, en el caso de 2014_10_12_000000_create_users_table.php ,encontramos el nombre en formato "studly case" en lugar de separado por guiones:

class CreateUsersTable extends Migration 
{
  // ...
}

Métodos de una migración

Dentro de la clase de la migración encontramos dos métodos up() y down()

class CreateUsersTable extends Migration
{
  public function up()
  {
    // ... 
  }

  public function down()
  {
    // ...
  }
}

El método up() vamos a especificar que queremos que haga nuestra migración. Para crear una tabla llamamos al método create del Facade Schema pasando como primer argumento el nombre de la tabla que queremos crear ( en este caso users ) y como segundo argumento una función anónima que recibe como argumento un objeto de la clase Blueprint . Con los métodos que nos provee este objeto diseñaremos la estructura de la tabla:

public function up()
{
  Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('email')->unique();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
  });
}

El método down() nos permite revertir o devolver la operación realizada en el método up() en el caso de CreateUsersTable , down() nos permitirá eliminar la tabla users utilizando el método.

public function down()
{
  Schema::dropIfExists('users');
}

Constructor de esquema (Schema Builder)

La clase Blueprint nos permite construir nuestra tablas con una interfaz orientada a objetos, a través de diferentes métodos por ejemplo:

$table->string('nombreDeLaColumna') permite crear una columna de tipo VARCHAR

$table->integer('nombreDeLaColumna') permite crear una columna de tipo INTEGER

Podemos encadenar metodos para especificar caracteristicas adicionales, ejemplo:

$table->integer('nombreDeLaColumna')->unsigned()->default(0); crea una columna de tipo entero sin signo y cuyo valor por defecto sera 0;

Métodos helpers

Nos facilitan tareas comunes y envía la necesidad de duplicar código por ejemplo el método:

$table->timestamps(); agrega 2 coulumna create_at y updated_at de tipo timestamp.

Ejecutar las migraciones

Con el comando de Artisan migrate podemos ejecutar todas las migraciones:

php artisan migrate

Facades

Shema y Route Facades son una manera de acceder a las clases internas del framework con una interfaz estática y fácil de usar.

Modificar una table

Para agregar una columna a la tabla, modificamos la migracion ya existente. En nuestro caso anadimos un campo profession con un limite de 100 caracteres a la tabla users .

<?php
//...
Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('email')->unique();  
    $table->string('profession', 100)->nullable(); // Agregamos una nueva columna
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
});

Comando reset

El comando de Artisan migrate:reset va a hacer un retroceso de la migracion ejecutada previamente por ejemplo en nuestro caso elimirara las tablas users y password_resets y luego podemos ejecutar el comando php artisan migrate para volver a crear las tablas.

Modificar un campo ya existente

Para modificar un campo ya existente, por ejemplo el limite de caracteres del campo profession, agregamos el nuevo valor en la migracion.

<?php
//...
Schema::create('users', function (Blueprint $table) {
    // ...
    $table->string('profession', 50)->nullable(); // Cambiamos el límite de 100 a 50
    // ...
});

luego para que este cambio tenga efecto debemos ejecutar el comando de Artisan migrate:refrsh .

Comando migrate:refresh

Este primero va a ejecutar un reset de todas las migraciones llamando el metodo down() y luego volvera a ejecutar las migraciones llamando el metodo up() .

php artisan migrate:refresh

Modificar migraciones

Al realizar una modificacion en la migracion original tenemos el problema de que los comandos reset y refresh eliminaran el contenido de las tablas en la base de datos. Para evitar esto podemos crear una nueva migracion y agregar desde ahi las modificaciones que necesitamos.

Es buena practica que el nombre de la migracion sea descriptivo y haga referencia a lo que vamos a hacer, ejemplo:

add_profession_to_users

Este ejemplo en su nombre indica que queremos agregar el campo profession a la tabla users . Dentro del metodo up() de la migracion en lugar de usar metodo create del facade Scheme utilizaremos table y pasaremos como primer argumento el nombre de la tabla que queremos modificar.

<?php
//...
Schema::table('users', (Blueprint $table)) {
    $table->string('profession', 50)->nullable();
});

En el metodo down() especificamos la accion inversa.

<?php
//...
Schema::table('users', function (Blueprint $table) {
    $table->dropColumn('profession');
});

Al final ejecutamos el comando make:migration

php artisan make:migration add_profession_to_users

Indicar la posicion de una columna

Al modificar una migracion utilizando Shema::table y agregar una columna, esta se va anadir al final de la tabla. Podemos lograr que la columna se cree en la posicion que indiquemos en el metodo after

<?php
//...
Schema::table('users', function (Blueprint $table) {
    $table->string('profession', 50)->nullable()->after('password');
});

Comando rollback

Utilizando el comando de Artisan migrate:rollback Laravel regresara el ultimo lote de migraciones ejecutado:

php artisan migrate:rollback

Crear y asociar tablas usando las migraciones de Laravel (Con claves foráneas)

Para crear una migración utilizamos el comando php artisan make:migration y para el nombre podemos utilizar algo similar al siguiente ejemplo create_nombre_de_la_tabla_table , Laravel automáticamente genera el código requerido para crear dicha tabla.

php artisan make:migration create_professions_table
public function up()
{
    Schema::create('professions', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamps();
    });
}

Que son llave primaria y foranea?

Llave primaria

Es un campo o grupo de campos de una tabla el cual identifica en forma única un registro. Ningún otro registro puede tener la misma llave primaria, estas llaves se utilizan para distinguir un registro con el fin de que se pueda tener acceso a ellos, organizarlos y manipularlos.

LLeva foranea

Básicamente es para asociar una tabla con otra, es una limitación entre dos tablas, las llaves foránea identifica una columna o grupo de columna en una tabla (hija o referendo) que se refiere a una columna o grupo de columnas en otra tabla (padre o referenciada).

Restriccion de clave foranea

Podemos anadir una restriccion de clave foranea a nuestro campo utilizando el metodo foreign()

Schema::create('users', function (Blueprint $table) {
    // ...
    $table->unsignedInteger('profession_id'); 
    $table->foreign('profession_id')->references('id')->on('professions');
    // ...
});

En este caso indicamos que el campo profession_id va a hacer referencia al campo id en la tabla professions , Es importante que el tipo del campo profession_id coincida con el campo id en la tabla professions

results matching ""

    No results matching ""