Laravel
Laravel 11 & 10 • Chapitre 2 : Base de Données

Migrations : Le Contrôle de Version de votre Schéma SQL

Les migrations permettent de concevoir et faire évoluer la structure de votre base de données en code PHP pur, versionné avec Git. Fini les exports de fichiers .sql manuels entre développeurs !

📜
Migrations Anonymes

Syntaxe moderne return new class extends Migration. Élimine tout risque de collision de noms de classe PHP.

🧱
Schema Builder

Types de données fluides et agnostiques du SGBD : id(), string(), decimal(), timestamps().

🔗
Clés Étrangères Modernes

Une seule ligne expressive : $table->foreignId('category_id')->constrained()->cascadeOnDelete();

⚡
Gestion par Artisan

Appliquez avec migrate, annulez avec rollback ou réinitialisez tout avec migrate:fresh.

database/migrations/xxxx_create_products_table.php (Syntaxe Moderne)
// Générer la migration en terminal :
// php artisan make:migration create_products_table

use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

// Migration anonyme moderne (Laravel 10 & 11)
return new class extends Migration
{
    /**
     * Exécute les migrations (Création ou modification de table).
     */
    public function up(): void
    {
        Schema::create('products', function (Blueprint $table) {
            $table->id(); // BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY
            $table->string('name', 150); // VARCHAR(150)
            $table->string('slug')->unique(); // Index unique pour URLs propres
            $table->text('description')->nullable(); // TEXT autorisant NULL
            $table->decimal('price', 10, 2); // 10 chiffres au total, 2 décimales (ex: 99.99)
            $table->integer('stock')->default(0); // Entier avec valeur par défaut
            $table->boolean('is_active')->default(true); // TINYINT(1) booléen

            // Clé étrangère moderne (remplace les anciennes syntaxes verbeuses de Laravel 6/7)
            // Lie automatiquement vers la table 'categories' et la colonne 'id'
            $table->foreignId('category_id')
                  ->constrained()
                  ->cascadeOnDelete();

            $table->timestamps(); // Colonnes 'created_at' et 'updated_at'
        });
    }

    /**
     * Annule la migration (Rollback).
     */
    public function down(): void
    {
        Schema::dropIfExists('products');
    }
};

Simulateur Artisan Migration Studio

Exécution Virtuelle Artisan

Testez en direct les différentes commandes Artisan de migration et visualisez l'impact instantané sur l'état des tables créées dans la base de données.

// Console interactive Laravel Artisan CLI
$ php artisan migrate
INFO Preparing database.
✓ 2026_10_10_000001_create_users_table ........... DONE (14.20ms)
✓ 2026_10_10_000002_create_categories_table ...... DONE (11.05ms)
✓ 2026_10_10_000003_create_products_table ........ DONE (22.80ms)
TABLEusers
6 colonnes
id, name, email, password, created_at, updated_at
TABLEcategories
6 colonnes
id, name, slug, description, created_at, updated_at
TABLEproducts
7 colonnes
id, name, slug, price, stock, category_id, created_at
Types de Colonnes & Modificateurs Indispensables
Méthode Schema BuilderType SQL ÉquivalentDescription & Cas d'Usage
$table->id()BIGINT UNSIGNED AUTO_INCREMENTClé primaire standard ultra-performante pour toutes vos tables.
$table->string('titre', 100)VARCHAR(100)Textes courts : nom, titre, email, mot de passe hashé.
$table->text('contenu')TEXT / LONGTEXTTextes longs : corps d'article, description détaillée, avis.
$table->decimal('prix', 10, 2)DECIMAL(10, 2)Montants financiers et prix précis sans erreurs d'arrondi à virgule flottante.
$table->foreignId('user_id')->constrained()BIGINT UNSIGNED + FOREIGN KEYClé étrangère moderne liée automatiquement à la table users.id.
->nullable()->default(...)ModificateursAutorise la valeur NULL ou définit une valeur par défaut.