Laravel 文档阅读:数据库之数据填充
简介#
种子类(Seed Classes)保存在 database/seeds
目录。种子类的命名,使用像 UsersTableSeeder
这样的约定(Convention)方式。默认,已为你创建了一个名为 DatabaseSeeder
的类,在该类内部可以使用 call
方法调用其他种子类、控制种子类的执行顺序。
写种子#
一个种子类就是一个种子(Seeder)。使用 Artisan 命令 make:seeder
创建种子,所有创建的种子保存在 database/seeds
目录。
php artisan make:seeder UsersTableSeeder
一个种子类默认仅包含一个方法:run
。这个方法在执行 Artisan 命令 db:seed
时被调用。在 run
方法内部,定义向数据库插入数据的逻辑。你可以使用查询语句构造器(Query Builder)手动插入数据或者使用 Eloquent 模型工厂方法(Eloquent model factories)。
下面是使用查询语句构造器手动插入数据的例子:
<?php
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
DB::table('users')->insert([
'name' => str_random(10),
'email' => str_random(10).'@gmail.com',
'password' => bcrypt('secret'),
]);
}
}
使用模型工厂方法#
有时,使用查询语句构造器手动插入数据会很麻烦,比如插入的数据量很大时,那么这时就可以选择使用模型工厂方法。首先,定义好模型工厂方法,接着就可以使用 factory
辅助方法向数据库插入数据了。
下面我们创建了 50 个用户并为每个用户伪造了一篇博文。
/**
* Run the database seeds.
*
* @return void
*/
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
方法、更加细粒度地、有选择地调用种子类,并控制种子类的执行顺序。
下面是一个例子:
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$this->call(UsersTableSeeder::class);
$this->call(PostsTableSeeder::class);
$this->call(CommentsTableSeeder::class);
}
执行种子#
一旦写好种子类,或者在 DatabaseSeeder
类中定义好了调用种子类的逻辑,就可以使用 Artisan 命令 db:seed
执行种子、向数据库填充数据了。
Artisan 命令 db:seed
默认运行 DatabaseSeeder
类;当然也可以使用 --class
选项指定要运行的种子类。
php artisan db:seed
php artisan db:seed --class=UsersTableSeeder
也可以在运行 migrate:refresh
命令时,通过指定 --seed
选项的方式填充数据。
php artisan migrate:refresh --seed
这句命令表示:还原 & 重新执行所有迁移,完成后再向数据库填充数据。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: