Init
This commit is contained in:
342
output/12.x/seeding.md
Normal file
342
output/12.x/seeding.md
Normal 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
|
||||
|
||||
Reference in New Issue
Block a user