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
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
Vous aimez mes articles ? Offrez-moi un café !
Ping : Premier projet Laravel 5.4 : La mise en place (configuration & database migration) (Part. 2/x) | Blog développeuse - Hamon