Skip to main content
Version: 5.x

Seeders

Introduction​

Seeding lets you populate your database with test data for development. Each seeder is tied to a table and generates data using the Faker library.

Creating a seeder​

php bow add:seeder users

A file will be created in the seeders/ directory with a timestamp:

seeders/20260309120000-users.php
<?php

use Faker\Factory as FakerFactory;

class Users20260309120000
{
public function run()
{
$faker = FakerFactory::create();

// Write the seeding here
}

/**
* Return the list of depended seeder
*
* @return array
*/
public function depends()
{
return [];
}
}

Complete example​

seeders/20260309120000-users.php
<?php

use App\Models\User;
use Faker\Factory as FakerFactory;

class Users20260309120000
{
public function run()
{
$faker = FakerFactory::create();

foreach (range(1, 50) as $i) {
$user = User::create([
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'password' => app_hash('password'),
'avatar' => $faker->imageUrl(200, 200, 'people'),
'bio' => $faker->paragraph,
'is_active' => $faker->boolean(80),
'created_at' => $faker->dateTimeBetween('-1 year')->format('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
]);
$user->persist();
}
}

public function depends()
{
return [];
}
}

Dependencies between seeders​

The depends() method lets you define the seeders that must run before this one:

seeders/20260309130000-posts.php
<?php

use App\Models\Post;
use App\Models\User;
use Faker\Factory as FakerFactory;

class Posts20260309130000
{
public function run()
{
$faker = FakerFactory::create();

// Get the IDs of the users that have already been seeded
$userIds = User::all()->map(fn ($user) => $user->id)->toArray();

foreach (range(1, 100) as $i) {
$post = Post::create([
'user_id' => $faker->randomElement($userIds),
'title' => $faker->sentence,
'slug' => $faker->slug,
'content' => $faker->paragraphs(5, true),
'published_at' => $faker->optional(0.7)->dateTimeBetween('-6 months')?->format('Y-m-d H:i:s'),
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
]);
$post->persist();
}
}

public function depends()
{
return [
Users20260309120000::class,
];
}
}

Running seeders​

A specific seeder​

php bow seed:file Users20260309120000

All seeders​

php bow seed:all

Reference data​

For reference data (roles, statuses, etc.), use a dedicated seeder:

seeders/20260309100000-roles.php
<?php

use Bow\Database\Database;

class Roles20260309100000
{
public function run()
{
$roles = [
['name' => 'admin', 'display_name' => 'Administrateur'],
['name' => 'moderator', 'display_name' => 'Modérateur'],
['name' => 'user', 'display_name' => 'Utilisateur'],
];

foreach ($roles as $role) {
Database::table('roles')->insert(array_merge($role, [
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
]));
}
}

public function depends()
{
return [];
}
}

Useful Faker methods​

MethodDescriptionExample
$faker->nameFull nameJean Dupont
$faker->emailEmailjean@example.com
$faker->unique()->emailUnique email-
$faker->safeEmailTest emailuser@example.org
$faker->passwordPassworda3$kLm9x
$faker->phoneNumberPhone number+33 6 12 34 56 78
$faker->addressFull address-
$faker->cityCityParis
$faker->countryCountryFrance
$faker->text(200)Text (200 chars)-
$faker->paragraphParagraph-
$faker->sentenceSentence-
$faker->boolean(70)Boolean (70% true)true/false
$faker->numberBetween(1, 100)Number42
$faker->randomFloat(2, 0, 1000)Decimal123.45
$faker->dateTimeBetween('-1 year')DateDateTime
$faker->optional(0.8)->nameNullable (80%)Jean or null
$faker->randomElement(['a', 'b'])Random choicea
$faker->imageUrl(200, 200)Image URLhttps://...
$faker->uuidUUID550e8400-...
$faker->slugSlugmon-article
Localization

Use FakerFactory::create('fr_FR') for data in French.

Is something missing?

If you run into problems with the documentation or have suggestions to improve the documentation or the project in general, please open an issue for us, or send a tweet mentioning the Twitter account @bowframework or directly on github.