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

Factories & Seeders : Remplir la Base de Données avec Élégance

Ne perdez plus de temps à remplir vos formulaires manuellement pour tester votre application ! Grâce à la bibliothèque FakerPHP et au puissant système de Factories de Laravel, générez des milliers de jeux de données réalistes en une ligne de commande.

🎭
FakerPHP Intégré

Générez des données humaines et cohérentes : faux emails uniques, noms, adresses, prix décimaux, phrases et paragraphes.

🧬
Factory States

Définissez des variantes modulaires en une méthode : User::factory()->admin()->create() ou Product::factory()->promo()->create().

🔗
Relations Imbriquées

Liez automatiquement parents et enfants : Category::factory()->has(Product::factory()->count(5))->create().

🌱
DatabaseSeeder

Orchestrez l'ordre d'insertion de toute votre base avec la commande magique php artisan migrate:fresh --seed.

ProductFactory.php & DatabaseSeeder.php
// 1. database/factories/ProductFactory.php
namespace DatabaseFactories;

use AppModelsCategory;
use IlluminateDatabaseEloquentFactoriesFactory;
use IlluminateSupportStr;

class ProductFactory extends Factory
{
    public function definition(): array
    {
        $nom = fake()->unique()->words(3, true);

        return [
            'name' => ucfirst($nom),
            'slug' => Str::slug($nom),
            'description' => fake()->paragraph(2),
            'price' => fake()->randomFloat(2, 10, 499), // Prix entre 10 et 499 €
            'stock' => fake()->numberBetween(0, 100),
            'is_active' => fake()->boolean(85), // 85% de chance d'être actif
            // Lie automatiquement une catégorie ou en génère une nouvelle
            'category_id' => Category::factory(),
        ];
    }

    // Factory State pour générer des produits en solde
    public function enPromotion(): static
    {
        return $this->state(fn (array $attributes) => [
            'price' => 19.99,
            'is_active' => true,
        ]);
    }
}

// 2. database/seeders/DatabaseSeeder.php
namespace DatabaseSeeders;

use AppModelsUser;
use AppModelsCategory;
use AppModelsProduct;
use IlluminateDatabaseSeeder;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        // Créer un administrateur fixe pour se connecter en développement
        User::factory()->create([
            'name' => 'Admin Test',
            'email' => 'admin@learnweb.test',
        ]);

        // Créer 5 catégories, chacune contenant entre 6 et 10 produits
        Category::factory()
            ->count(5)
            ->has(Product::factory()->count(8))
            ->create();
    }
}

Simulateur Générateur Faker & Seeder Studio

Simulation FakerPHP

Configurez votre commande de génération et lancez la simulation pour observer les données aléatoires créées instantanément par la Factory.

IDNom Produit (Faker::words)Catégorie (Relation)Prix (decimal:2)StockStatut
#101Casque Audio Bluetooth Pro
slug: casque-audio-bluetooth-pro
Audio & Vidéo 89.90 € 14 en stock Actif
#102Clavier Mécanique RGB Sans Fil
slug: clavier-mecanique-rgb-sans-fil
Périphériques 119.50 € 6 en stock Actif
#103Écran Gaming 4K Ultra HD
slug: ecran-gaming-4k-ultra-hd
Informatique 349.00 € 2 en stock Actif
#104Souris Ergonomique Haute Précision
slug: souris-ergonomique-haute-precision
Périphériques 49.99 € 25 en stock Actif
#105Hub USB-C 8 en 1 Aluminium
slug: hub-usb-c-8-en-1-aluminium
Accessoires 39.90 € Rupture Brouillon
Séparer Seeders Métier et Données de Test

Ne mélangez pas vos données indispensables (rôles d'utilisateurs, pays, taxes) et les fausses données de test.

Créez des seeders dédiés : RoleSeeder.php que vous pouvez exécuter sans risque en production avec php artisan db:seed --class=RoleSeeder.

Tester et Déboguer avec Tinker

Le REPL interactif de Laravel permet d'expérimenter vos factories directement dans votre console :

php artisan tinker

> User::factory()->count(3)->make(); // Génère les objets sans écrire en BDD
> Product::count(); // Renvoie le nombre total de produits