Chapitre 4Projet SunuLearn

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_table

Cela 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