简介
种子类(Seed Class)保存在 database/seeds
目录。种子的命名,像 UsersTablesseeder
这样的约定(convention)方式。默认,已为你创建一个DatabaseSeeder
的类,在该类内部可以使用 call
方法调用其他种子类,控制种子类的执行顺序
写种子
一个种子类就是一个种子(Seeder)。使用 Artisan 命令:make seeder
创建种子,所有的种子保存在 database/seed
;
php artisan make:seederUsersTableSeeder;
一个种子类默认包含一个方法: run
。这个方法在执行 Artisan 命令:db:seeder
是被调用。在 run
方法内部,定义向数据库插入数据的逻辑。您可以是那个使用查询语句构造器(Query Builder)手动插入数据或使用 Eloquent 模型工程方法(Eloquent model factories)。
下面是使用查询语句构造器手动插入数据的例子:
<?php
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Modles;
class DatabaseSeeder extends Seeder
{
//Run the databases seeds, @return void
public function run()
{
DB::table('users')->insert([
'name' => str_random(10),
'email` => str_random .'@gmail.com`,
'password` => becrypt(`secret`),
])->toArray();
}
}
使用模型工厂
有时,实用查询语句构造器手动插入数据会比较麻烦。如插入的数据量很大,这时就可以选择使用模型工厂法。首先,定义好模型工厂方法,接着就可以使用 factory
辅助方法向数据库插入数据。
下面我们创建了50个用户并未每个用户伪造了一篇文章。
<?php
public function run(){
factory(App\Models\user::class,50)->create()->each(function ($u)
{
$u->posts()->save(factory(App\Models\Post::class)->make());
});
}
调用种子类
已经说过,在 DatabaseSeeder 类内部使用 call 方法调用种子类。
使用种子类的好处:可以将向数据库填充数据的逻辑拆分到多个文件里,从而避免将填充数据的逻辑统一写在一个文件里造成的文件过于巨大的问题。并且,你可以使用 call 方法、更加细粒度地、有选择地调用种子类,并控制种子类的执行顺序。
下面是一个例子:
public function run(){
run[
$this->call(UsersTableSeeder::class),
$this->call(PosetTableSeeder::class),
$this->call(CommenTableSeeder::class),
];
}
执行种子
一旦写好种子类,或者在 DatabaseSeeder
类中定义好了调用种子类的逻辑,就可以使用 Artisan 命令 db:seed
执行种子、向数据库填充数据了。
Artisan 命令 db:seed 默认运行 DatabaseSeeder
类;当然也可以使用 --class
选项指定要运行的种子类。
php artisan db:seed
php artisan migrate:seed --class=UsersTableSeeder
也可以在运行 migrate:refresh
命令时,通过指定 --seed
选项的方式填充数据。
php artisan migrate:refresh --seed
这个命令表示:还原 & 重新执行所有迁移,完成后再向数据库填充数据。
网友评论