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