This commit is contained in:
2025-09-02 15:19:23 +02:00
commit 9b2b03b2ef
108 changed files with 166712 additions and 0 deletions

342
output/12.x/seeding.md Normal file
View File

@@ -0,0 +1,342 @@
# Database: Seeding
* Introduction
* Writing Seeders
* Using Model Factories
* Calling Additional Seeders
* Muting Model Events
* Running Seeders
## Introduction
Laravel includes the ability to seed your database with data using seed
classes. All seed classes are stored in the `database/seeders` directory. By
default, a `DatabaseSeeder` class is defined for you. From this class, you may
use the `call` method to run other seed classes, allowing you to control the
seeding order.
[Mass assignment protection](/docs/12.x/eloquent#mass-assignment) is
automatically disabled during database seeding.
## Writing Seeders
To generate a seeder, execute the `make:seeder` [Artisan
command](/docs/12.x/artisan). All seeders generated by the framework will be
placed in the `database/seeders` directory:
1php artisan make:seeder UserSeeder
php artisan make:seeder UserSeeder
A seeder class only contains one method by default: `run`. This method is
called when the `db:seed` [Artisan command](/docs/12.x/artisan) is executed.
Within the `run` method, you may insert data into your database however you
wish. You may use the [query builder](/docs/12.x/queries) to manually insert
data or you may use [Eloquent model factories](/docs/12.x/eloquent-factories).
As an example, let's modify the default `DatabaseSeeder` class and add a
database insert statement to the `run` method:
1<?php
2 
3namespace Database\Seeders;
4 
5use Illuminate\Database\Seeder;
6use Illuminate\Support\Facades\DB;
7use Illuminate\Support\Facades\Hash;
8use Illuminate\Support\Str;
9 
10class DatabaseSeeder extends Seeder
11{
12 /**
13 * Run the database seeders.
14 */
15 public function run(): void
16 {
17 DB::table('users')->insert([
18 'name' => Str::random(10),
19 'email' => Str::random(10).'@example.com',
20 'password' => Hash::make('password'),
21 ]);
22 }
23}
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeders.
*/
public function run(): void
{
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@example.com',
'password' => Hash::make('password'),
]);
}
}
You may type-hint any dependencies you need within the `run` method's
signature. They will automatically be resolved via the Laravel [service
container](/docs/12.x/container).
### Using Model Factories
Of course, manually specifying the attributes for each model seed is
cumbersome. Instead, you can use [model factories](/docs/12.x/eloquent-
factories) to conveniently generate large amounts of database records. First,
review the [model factory documentation](/docs/12.x/eloquent-factories) to
learn how to define your factories.
For example, let's create 50 users that each has one related post:
1use App\Models\User;
2 
3/**
4 * Run the database seeders.
5 */
6public function run(): void
7{
8 User::factory()
9 ->count(50)
10 ->hasPosts(1)
11 ->create();
12}
use App\Models\User;
/**
* Run the database seeders.
*/
public function run(): void
{
User::factory()
->count(50)
->hasPosts(1)
->create();
}
### Calling Additional Seeders
Within the `DatabaseSeeder` class, you may use the `call` method to execute
additional seed classes. Using the `call` method allows you to break up your
database seeding into multiple files so that no single seeder class becomes
too large. The `call` method accepts an array of seeder classes that should be
executed:
1/**
2 * Run the database seeders.
3 */
4public function run(): void
5{
6 $this->call([
7 UserSeeder::class,
8 PostSeeder::class,
9 CommentSeeder::class,
10 ]);
11}
/**
* Run the database seeders.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
PostSeeder::class,
CommentSeeder::class,
]);
}
### Muting Model Events
While running seeds, you may want to prevent models from dispatching events.
You may achieve this using the `WithoutModelEvents` trait. When used, the
`WithoutModelEvents` trait ensures no model events are dispatched, even if
additional seed classes are executed via the `call` method:
1<?php
2 
3namespace Database\Seeders;
4 
5use Illuminate\Database\Seeder;
6use Illuminate\Database\Console\Seeds\WithoutModelEvents;
7 
8class DatabaseSeeder extends Seeder
9{
10 use WithoutModelEvents;
11 
12 /**
13 * Run the database seeders.
14 */
15 public function run(): void
16 {
17 $this->call([
18 UserSeeder::class,
19 ]);
20 }
21}
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
class DatabaseSeeder extends Seeder
{
use WithoutModelEvents;
/**
* Run the database seeders.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
]);
}
}
## Running Seeders
You may execute the `db:seed` Artisan command to seed your database. By
default, the `db:seed` command runs the `Database\Seeders\DatabaseSeeder`
class, which may in turn invoke other seed classes. However, you may use the
`--class` option to specify a specific seeder class to run individually:
1php artisan db:seed
2 
3php artisan db:seed --class=UserSeeder
php artisan db:seed
php artisan db:seed --class=UserSeeder
You may also seed your database using the `migrate:fresh` command in
combination with the `--seed` option, which will drop all tables and re-run
all of your migrations. This command is useful for completely re-building your
database. The `--seeder` option may be used to specify a specific seeder to
run:
1php artisan migrate:fresh --seed
2 
3php artisan migrate:fresh --seed --seeder=UserSeeder
php artisan migrate:fresh --seed
php artisan migrate:fresh --seed --seeder=UserSeeder
#### Forcing Seeders to Run in Production
Some seeding operations may cause you to alter or lose data. In order to
protect you from running seeding commands against your production database,
you will be prompted for confirmation before the seeders are executed in the
`production` environment. To force the seeders to run without a prompt, use
the `--force` flag:
1php artisan db:seed --force
php artisan db:seed --force