A seeder is a class in database/seeders with a run() method (make:seeder). Reference data every environment needs, like MySQL's category tree, must be idempotent:
$books = Category::firstOrCreate(['name' => 'Books']);
foreach (['Programming', 'Databases', 'Design'] as $name) {
Category::firstOrCreate(['name' => $name], ['parent_id' => $books->id]);
}
Category::firstOrCreate(['name' => 'Accessories']);DatabaseSeeder, which db:seed runs, calls $this->call(CategorySeeder::class), then DemoShopSeeder (Factory States) unless app()->isProduction(). Its WithoutModelEvents trait silences model events. migrate:fresh --seed rebuilt from the dump and seeded:
$ php artisan migrate:fresh --seed ... database/schema/mysql-schema.sql ................................... 1s DONE INFO Nothing to migrate. ... Database\Seeders\DemoShopSeeder .............................. 1,092 ms DONE
A second db:seed --class=CategorySeeder left five categories, not ten. Seeding disables mass-assignment protection, and in production db:seed needs --force.