Passer au contenu principal

Qu’est-ce que le seeding

Le seeding est le mécanisme permettant d’insérer des données d’exemple ou des données initiales dans la base. Lors de la mise en place d’un environnement de développement ou de tests automatisés, il est nécessaire de disposer d’un état pré-rempli. Comme saisir manuellement les données à chaque fois est coûteux, on regroupe le processus dans des seeders réexécutables. Les classes de seeder sont stockées dans le répertoire database/seeders. Par défaut, une classe DatabaseSeeder est fournie.

Créer un seeder

Utilisez la commande Artisan make:seeder pour générer une nouvelle classe.
php artisan make:seeder UserSeeder
Le fichier généré est placé dans database/seeders/UserSeeder.php.
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class UserSeeder extends Seeder
{
    /**
     * Exécute le seeder.
     */
    public function run(): void
    {
        // Écrivez ici votre logique d'insertion
    }
}

Implémenter le seeder

Écrivez la logique d’insertion dans la méthode run(). Vous pouvez utiliser la façade DB ou les modèles Eloquent.

Utiliser la façade DB

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;

class UserSeeder extends Seeder
{
    public function run(): void
    {
        DB::table('users')->insert([
            [
                'name' => 'Taro Yamada',
                'email' => '[email protected]',
                'password' => Hash::make('password'),
                'created_at' => now(),
                'updated_at' => now(),
            ],
            [
                'name' => 'Hanako Suzuki',
                'email' => '[email protected]',
                'password' => Hash::make('password'),
                'created_at' => now(),
                'updated_at' => now(),
            ],
        ]);
    }
}

Utiliser les modèles Eloquent

use App\Models\User;
use Illuminate\Support\Facades\Hash;

public function run(): void
{
    User::create([
        'name' => 'Administrateur',
        'email' => '[email protected]',
        'password' => Hash::make('password'),
    ]);
}
Pendant l’exécution des seeders, la protection contre l’assignation en masse est automatiquement désactivée. Vous pouvez insérer des données sans vous soucier des réglages $fillable ou $guarded.

Combinaison avec les factories

Pour de grandes quantités de données de test, la combinaison avec les factories de modèles est pratique. Elles génèrent des données aléatoires en masse.
use App\Models\User;
use App\Models\Post;

public function run(): void
{
    // Crée 10 utilisateurs
    User::factory(10)->create();

    // Crée 3 publications pour chaque utilisateur
    User::factory(5)
        ->hasPosts(3)
        ->create();
}
Pour l’usage détaillé des factories, consultez la documentation des factories Eloquent.

Utilisation de DatabaseSeeder

DatabaseSeeder est le point d’entrée qui orchestre plusieurs seeders. Utilisez call() pour spécifier ceux à exécuter.
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        $this->call([
            UserSeeder::class,
            PostSeeder::class,
            CommentSeeder::class,
        ]);
    }
}
Les seeders sont exécutés dans l’ordre passé à call(). En présence de contraintes de clé étrangère, seedez d’abord les tables référencées (par exemple, usersposts).

Exécuter les seeders

Exécuter tous les seeders

php artisan db:seed
DatabaseSeeder est invoqué et exécute ensuite dans l’ordre les seeders passés à call().

Exécuter un seeder spécifique

L’option --class permet de spécifier la classe à exécuter.
php artisan db:seed --class=UserSeeder

Exécuter en même temps que les migrations

L’option --seed de migrate:fresh recrée toutes les tables puis exécute les seeders en une seule commande.
php artisan migrate:fresh --seed
Pour n’exécuter qu’un seeder particulier, utilisez --seeder.
php artisan migrate:fresh --seed --seeder=UserSeeder
migrate:fresh supprime et recrée toutes les tables. Toutes les données existantes seront perdues ; ne l’utilisez donc pas en production.

Exécution en production

Lancer un seeding en production affiche une invite de confirmation. Pour l’exécuter sans confirmation, utilisez --force.
php artisan db:seed --force
Un seeding en production peut écraser ou perdre des données. Faites toujours une sauvegarde avant d’exécuter.

Suppression des événements de modèle

Pour empêcher le déclenchement des événements de modèle (creating, created, etc.) pendant le seeding, utilisez le trait WithoutModelEvents.
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;

class DatabaseSeeder extends Seeder
{
    use WithoutModelEvents;

    public function run(): void
    {
        $this->call([
            UserSeeder::class,
        ]);
    }
}
Ce trait s’applique aussi aux seeders enfants appelés via call().

Exemple pratique : seeder d’une application de blog

Voici un exemple de mise en place de données initiales pour une application de blog avec utilisateurs et publications.
// database/seeders/UserSeeder.php
class UserSeeder extends Seeder
{
    public function run(): void
    {
        User::factory(10)->create();
    }
}

// database/seeders/PostSeeder.php
class PostSeeder extends Seeder
{
    public function run(): void
    {
        // Crée 2 à 5 publications pour chaque utilisateur
        User::all()->each(function ($user) {
            Post::factory(rand(2, 5))->create([
                'user_id' => $user->id,
            ]);
        });
    }
}

// database/seeders/DatabaseSeeder.php
class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        $this->call([
            UserSeeder::class,
            PostSeeder::class, // Exécuté après users
        ]);
    }
}
Commande d’exécution :
php artisan migrate:fresh --seed

Prochaines étapes

Introduction à Eloquent

Apprenez à récupérer et manipuler les données insérées via l’ORM Eloquent.
Dernière modification le 13 juillet 2026