Comprendre Laravel 5.4 : Les migrations

A quoi sert le système de migration ?

Laravel nous offre un système de migration pratique et facile à exécuter grâce aux commandes artisan. Chaque script permet de jouer une migration et de la défaire, génial non ?

Pré-requis

Avant de pouvoir réaliser des migrations, on va renseigner les informations de connexion à la base de données dans le fichier .env pour pouvoir utiliser les commandes artisan.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel-test
DB_USERNAME=root
DB_PASSWORD=

Les commandes artisan de migration :

Note : Pour obtenir la liste des commandes artisan disponibles, il faudra suffit de demander !

/* à la racine du projet (cd) */
php artisan -list
Comme on le voit dans la liste, les commandes de migration se résument à :
  migrate:             Run the database migrations     
  /* ... */
  migrate:install      Create the migration repository
  migrate:refresh      Reset and re-run all migrations
  migrate:reset        Rollback all database migrations
  migrate:rollback     Rollback the last database migration
  migrate:status       Show the status of each migration
  /* ... */
  make:migration       Create a new migration file

Créer un fichier de migration :

On va donc créer un fichier de migration où CreatePostTable est le nom de notre classe de migration :

php artisan make:migration CreatePostTable

Ce qui nous crée un fichier dans le dossier database/migrations

La classe possède une méthode up() qui est donc pour jouer la migration et une méthode down() pour défaire la migration.

Créer une table :

Dans la méthode up() de cet exemple, je crée une table posts. Pour avoir accès à cette fonctionnalité, on injectera à notre méthode anonyme, la façade Blueprint.

/* CreatePostTable */
<?php 
use Illuminate\Support\Facades\Schema; 
use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 
class CreatePostTable extends Migration { 

   /** 
   * Run the migrations. 
   * 
   * @return void 
   */
   public function up() { 
      Schema::create('posts', function (Blueprint $table) {
         $table->increments('id'); 
         $table->string('title', 300);
         $table->string('content');
         $table->integer('user_id')->unsigned();
         $table->foreign('user_id')->references('id')->on('users');
         $table->timestamps(); /* ajoute les colonnes de date de création et modification */
     }); 
   } 
   /** 
   * Reverse the migrations. 
   * 
   * @return void 
   */
   public function down() { 
      Schema::dropIfExists('posts'); 
   } 
}

Pour jouer une migration on utilisera la commande :

php artisan migrate

Tandis que si l’on souhaite tout rejouer, ça sera la commande :

php artisan migrate:refresh

Modifier une colonne d’une table :

Précédemment, on a créé une table dans la méthode up(). Maintenant dans une nouvelle migration, on voudrait ajouter une limite de caractères à la colonne content de 2000.

Schema::table('posts', function (Blueprint $table) {
    $table->string('content', 2000)->change();
});

Suppression de colonne d’une table :

On voudrait supprimer une ou plusieurs colonnes, la tâche serait toujours aussi simple :

Schema::table('posts', function (Blueprint $table) {
    $table->dropColumn(['title', 'content']);
});

Création de contraintes sur une colonne :

/* exemple pour indiquer que l'email est unique */
/* à la création de la colonne */ 
$table->string('email')->unique(); 
/* à la modification de la colonne */ 
$table->unique('email');
$table->primary('id'); /* crée une clé primaire */
$table->primary(['indexPartA', 'indexPartB']); /* crée une clé primaire composée de 2 colonnes */
$table->index('state'); /* ajout d'un index sur la colonne "état" */

Supprimer une contrainte:

Cela fonctionne comme l’ajout de contrainte mais préfixé de « drop » 😉

$table->dropPrimary('id'); /* supprime la clé primaire */
$table->dropUnique('users_email_unique'); /* Supprime un index unique */
$table->dropIndex('state'); /* Supprime l'index sur la colonne "state" */
$table->dropForeign(['other_table_id']); /* Supprime la contrainte de clé étrangère */

Les contraintes de clés étrangères :

Pour les clés étrangères la syntaxe reste simple mais je préfère mettre l’exemple complet de ma table « posts » à laquelle je veux ajouter une clé étrangère qui pointe sur l’id de l’utilisateur :

Schema::create('posts', function (Blueprint $table) {
   $table->increments('id');
   $table->string('title', 300);
   $table->string('content');
   $table->integer('user_id')->unsigned();
   $table->foreign('user_id')->references('id')->on('users');
   $table->timestamps();
});

Si l’utilisateur cloture son compte, on pourrait imaginer que ses posts doivent être supprimés, on ajoutera la contrainte « delete on cascade » de cette façon :

$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

On pourra également supprimer la contrainte de la colonne user_id comme vu plus haut :

 $table->dropForeign(['user_id']);

Astuce : Comment activer et désactiver les clés étrangères lors des migrations ?

Laravel nous donne 2 méthodes afin de pouvoir faire ça, ce qui peut être assez pratique lors de tests par exemple.

Schema::enableForeignKeyConstraints(); /* active */
Schema::disableForeignKeyConstraints(); /* désactive */

Voilà dans les grandes lignes, on va de toutes façons utiliser se système au cours du fil rouge « Premier projet avec Laravel 5.4 » !!

Toute la doc officielle : https://laravel.com/docs/5.4/migrations

Une réflexion au sujet de « Comprendre Laravel 5.4 : Les migrations »

  1. Ping : Premier projet Laravel 5.4 : La mise en place (configuration & database migration) (Part. 2/x) | Blog développeuse - Hamon

Laisser un commentaire