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​
| Method | Description | Example |
|---|---|---|
$faker->name | Full name | Jean Dupont |
$faker->email | jean@example.com | |
$faker->unique()->email | Unique email | - |
$faker->safeEmail | Test email | user@example.org |
$faker->password | Password | a3$kLm9x |
$faker->phoneNumber | Phone number | +33 6 12 34 56 78 |
$faker->address | Full address | - |
$faker->city | City | Paris |
$faker->country | Country | France |
$faker->text(200) | Text (200 chars) | - |
$faker->paragraph | Paragraph | - |
$faker->sentence | Sentence | - |
$faker->boolean(70) | Boolean (70% true) | true/false |
$faker->numberBetween(1, 100) | Number | 42 |
$faker->randomFloat(2, 0, 1000) | Decimal | 123.45 |
$faker->dateTimeBetween('-1 year') | Date | DateTime |
$faker->optional(0.8)->name | Nullable (80%) | Jean or null |
$faker->randomElement(['a', 'b']) | Random choice | a |
$faker->imageUrl(200, 200) | Image URL | https://... |
$faker->uuid | UUID | 550e8400-... |
$faker->slug | Slug | mon-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.