Migrations — structurer la base de données
CREATE TABLE en PHP, types de colonnes et clés étrangères
Concepts Théoriques
En PHP pur, vous créez les tables manuellement avec phpMyAdmin ou un fichier SQL. Le problème : si un collègue rejoint le projet, il doit recréer la base à la main. Si vous ajoutez une colonne, il faut prévenir tout le monde. Si vous déployez en production, il faut se souvenir de chaque modification.
Les migrations résolvent ce problème. Ce sont des fichiers PHP versionnés qui décrivent la structure de la base. Chaque migration est un CREATE TABLE ou ALTER TABLE exécutable avec une commande. Toute l'équipe exécute php artisan migrate et obtient la même base.
Créer une migration
php artisan make:migration create_categories_tableCela crée un fichier dans database/migrations/ avec un timestamp : 2026_03_24_000001_create_categories_table.php. Le timestamp garantit l'ordre d'exécution.
Structure d'une migration
return new class extends Migration
{
public function up(): void
{
Schema::create('categories', function (Blueprint $table) {
$table->id(); // BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY
$table->string('name', 100); // VARCHAR(100)
$table->string('slug', 100)->unique();
$table->text('description')->nullable();
$table->boolean('is_active')->default(true);
$table->timestamps(); // created_at + updated_at
});
}
public function down(): void
{
Schema::dropIfExists('categories');
}
};up() crée la table (exécuté par php artisan migrate). down() la supprime (exécuté par php artisan migrate:rollback). C'est réversible.
Types de colonnes disponibles
| Méthode Blueprint | Équivalent SQL | Usage |
|---|---|---|
| $table->id() | BIGINT UNSIGNED AUTO_INCREMENT PK | Clé primaire |
| $table->string('name', 100) | VARCHAR(100) | Texte court |
| $table->text('content') | TEXT | Texte long |
| $table->integer('count') | INT | Nombre entier |
| $table->decimal('price', 10, 2) | DECIMAL(10,2) | Prix |
| $table->boolean('is_active') | TINYINT(1) | Vrai/faux |
| $table->date('birth_date') | DATE | Date |
| $table->dateTime('published_at') | DATETIME | Date + heure |
| $table->timestamps() | created_at + updated_at | Horodatage auto |
| $table->softDeletes() | deleted_at | Suppression logique |
| $table->foreignId('user_id')->constrained() | FK vers users(id) | Clé étrangère |
Les modificateurs : ->nullable() (accepte NULL), ->default('value') (valeur par défaut), ->unique() (valeur unique), ->after('column') (position).
Clés étrangères
$table->foreignId('category_id')->constrained()->onDelete('cascade');C'est un raccourci pour : créer une colonne category_id (BIGINT UNSIGNED), ajouter une clé étrangère vers categories(id), avec suppression en cascade.
Exécuter les migrations
php artisan migrate # Exécuter les migrations en attente
php artisan migrate:rollback # Annuler la dernière migration
php artisan migrate:fresh # Tout supprimer et tout recréer (dev seulement !)
php artisan migrate:status # Voir l'état des migrations