Contactez-nous

Créer un modèle et sa migration avec `php artisan make:model -m`

Apprenez à utiliser la commande Artisan `php artisan make:model -m` dans Laravel pour générer simultanément un modèle Eloquent et son fichier de migration associé.

Simplifier la création de modèles et migrations grâce à Artisan

Dans le développement d'applications avec Laravel, les modèles Eloquent et les migrations de base de données sont des composants fondamentaux et étroitement liés. Un modèle représente une table de votre base de données, tandis qu'une migration définit la structure de cette table. Pour optimiser le flux de travail, Laravel, via son interface en ligne de commande Artisan, offre un moyen pratique de générer ces deux éléments simultanément. La commande php artisan make:model NomDuModele -m est l'outil clé pour cette tâche. Ce sous-chapitre détaille comment utiliser cette commande, ce qu'elle génère, et comment commencer à définir la structure de votre table dans le fichier de migration créé.

La commande `php artisan make:model -m` en action

Artisan est l'assistant en ligne de commande de Laravel, conçu pour automatiser les tâches répétitives. Pour créer un nouveau modèle Eloquent et son fichier de migration correspondant en une seule opération, vous utiliserez la commande make:model avec l'option -m (ou sa forme longue --migration).

Supposons que vous souhaitiez créer un modèle pour gérer des "Produits" dans votre application. Vous exécuteriez la commande suivante à la racine de votre projet Laravel :

php artisan make:model Product -m

Après l'exécution de cette commande, Artisan effectuera deux actions principales :

  1. Création du fichier de modèle : Un nouveau fichier nommé Product.php sera créé dans le répertoire app/Models/ (c'est l'emplacement par défaut pour les modèles dans les versions récentes de Laravel). Ce fichier contiendra une classe de base pour votre modèle Product, héritant de Illuminate\Database\Eloquent\Model.
  2. Création du fichier de migration : Un nouveau fichier de migration sera généré dans le répertoire database/migrations/. Le nom de ce fichier suivra un format horodaté, par exemple YYYY_MM_DD_HHMMSS_create_products_table.php. Le nom de la table (products) est déduit automatiquement du nom du modèle (Product) en suivant les conventions de Laravel (pluriel et snake_case).

Voici un aperçu de ce que contiendraient ces fichiers initialement :

Fichier du modèle (app/Models/Product.php) :

Fichier de migration (par ex., database/migrations/2023_10_27_103000_create_products_table.php) :

id(); // Crée une colonne 'id' BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY
            // C'est ici que vous allez définir les autres colonnes de votre table 'products'
            $table->timestamps(); // Crée les colonnes 'created_at' et 'updated_at' (TIMESTAMP NULLABLE)
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('products'); // Supprime la table 'products' si elle existe
    }
};

L'option -m simplifie donc le processus initial en s'assurant que vous disposez immédiatement des deux fichiers nécessaires pour commencer à définir votre entité Product et sa structure en base de données.

Définir la structure de la table dans le fichier de migration

Une fois le fichier de migration créé, l'étape suivante consiste à définir le schéma de votre table. Cela se fait principalement dans la méthode up() du fichier de migration, en utilisant le "Schema Builder" de Laravel. Le Schema Builder fournit une API fluide et expressive pour créer et manipuler des tables et leurs colonnes.

A l'intérieur de la closure passée à Schema::create(), vous avez accès à un objet Blueprint (ici, la variable $table). Cet objet offre une variété de méthodes pour définir différents types de colonnes. Voici quelques exemples courants :

    public function up(): void
    {
        Schema::create('products', function (Blueprint $table) {
            $table->id(); // Clé primaire auto-incrémentée 'id'
            $table->string('name'); // Colonne VARCHAR pour le nom du produit
            $table->text('description')->nullable(); // Colonne TEXT pour la description, peut être NULL
            $table->decimal('price', 8, 2); // Colonne DECIMAL pour le prix (ex: 999999.99)
            $table->integer('stock')->default(0); // Colonne INTEGER pour le stock, valeur par défaut 0
            $table->boolean('is_active')->default(true); // Colonne BOOLEAN pour le statut d'activité
            $table->foreignId('category_id')->nullable()->constrained()->onDelete('set null'); // Clé étrangère
            // $table->unsignedBigInteger('category_id')->nullable();
            // $table->foreign('category_id')->references('id')->on('categories')->onDelete('set null');
            $table->timestamps(); // Colonnes 'created_at' et 'updated_at'
        });
    }

Quelques types de colonnes et modificateurs fréquemment utilisés :

  • $table->string('column_name', length): Crée une colonne de type VARCHAR. La longueur par défaut est de 255.
  • $table->text('column_name'): Crée une colonne de type TEXT.
  • $table->integer('column_name'): Crée une colonne de type INTEGER.
  • $table->bigInteger('column_name'): Crée une colonne de type BIGINT.
  • $table->boolean('column_name'): Crée une colonne de type BOOLEAN.
  • $table->date('column_name'): Crée une colonne de type DATE.
  • $table->dateTime('column_name'): Crée une colonne de type DATETIME.
  • $table->timestamp('column_name'): Crée une colonne de type TIMESTAMP.
  • $table->decimal('column_name', total_digits, decimal_places): Crée une colonne de type DECIMAL.
  • $table->float('column_name', total_digits, decimal_places): Crée une colonne de type FLOAT.
  • $table->enum('column_name', ['value1', 'value2']): Crée une colonne de type ENUM.
  • $table->foreignId('column_name'): Raccourci pour créer une colonne BIGINT UNSIGNED pour une clé étrangère.

Modificateurs de colonnes :

  • ->nullable(): Permet à la colonne d'accepter des valeurs NULL.
  • ->default($value): Définit une valeur par défaut pour la colonne.
  • ->unique(): Ajoute une contrainte d'unicité à la colonne.
  • ->index(): Ajoute un index simple à la colonne.
  • ->after('another_column'): Place la colonne après une autre colonne spécifique (MySQL uniquement).
  • ->comment('Your comment'): Ajoute un commentaire à la colonne (si supporté par la base de données).
  • ->constrained('optional_table_name'): Utilisé avec foreignId pour définir la contrainte de clé étrangère.
  • ->onDelete('cascade' | 'set null' | 'restrict' ...): Définit l'action en cas de suppression de l'enregistrement parent.

La méthode down() doit contenir la logique pour inverser les opérations de la méthode up(). Dans le cas de la création d'une table, il s'agit généralement de la supprimer avec Schema::dropIfExists('table_name'). Une fois votre migration définie, vous l'exécuterez avec php artisan migrate pour appliquer les changements à votre base de données.

Options supplémentaires pour `make:model`

La commande php artisan make:model offre d'autres options utiles qui peuvent être combinées avec -m pour générer encore plus de code boilerplate :

  • -c ou --controller : Crée un nouveau contrôleur pour le modèle.
  • -f ou --factory : Crée une nouvelle factory pour le modèle, utile pour le seeding et les tests.
  • -s ou --seeder : Crée un nouveau seeder pour le modèle.
  • -r ou --resource : Indique que le contrôleur généré (si -c est utilisé) doit être un contrôleur de ressources (avec les méthodes CRUD).
  • --api : Indique que le contrôleur de ressources généré doit être un contrôleur d'API (sans les méthodes create et edit).
  • -p ou --policy : Crée une nouvelle classe de policy pour le modèle.
  • --all : Crée un modèle, une migration, une factory, un seeder, une policy, un contrôleur et des form requests. C'est un raccourci très puissant pour initialiser rapidement une nouvelle ressource.

Exemple d'utilisation combinée :

# Crée un modèle, une migration, une factory et un contrôleur de ressources pour 'Comment'
php artisan make:model Comment -mfrc

# Crée tous les fichiers associés pour une ressource 'Task'
php artisan make:model Task --all

L'utilisation judicieuse de ces options peut considérablement accélérer le processus de développement initial en générant une structure de base cohérente pour vos entités, vous permettant de vous concentrer plus rapidement sur l'implémentation de la logique métier.