Laravel 使用填充类和测试数据提供了一个简单方法来填充数据到数据库。所有的填充类都位于 database/seeds目录。
填充类的类名完全由你自定义,但最好还是遵循一定的规则,比如可读性,例如 UserTableSeeder等等。安装完 Laravel 后,会默认提供一个DatabaseSeeder类。从这个类中,你可以使用 call方法来运行其他填充类,从而允许你控制填充顺序。
定义模型工厂
先在 database/factories/ModelFactory.php 文件中定义一个工厂:
$factory->define(App\Test::class, function (Faker\Generator $faker) {
return [
'name' => $faker->name,
'airline' => $faker->unique()->randomNumber(),
'description' => $faker->text(),
];
});
闭包内为工厂的定义,你可以返回模型中所有属性的默认测试值。在该闭包内会接收到 Faker PHP 函数库的实例,它可以让你很方便的生成各种随机数据以进行测试。
当然,你也可以随意将自己额外的工厂增加至 ModelFactory.php文件。你也可以在 database/factories里为每一个数据模型创建对应的工厂模型类,如 UserFactory.php和 CommentFactory.php。 在 factories目录中的文件都会被 Laravel 自动加载。
使用模型工厂
Laravel 安装时自带的 DatabaseSeeder 类,有添加一个数据库插入语句到 run 方法
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
// $this->call(UsersTableSeeder::class);
factory(App\Test::class,5)->create();
}
}
然后运行命令
php artisan migrate:refresh --seed
你也可以使用另一种方法单独填充数据
生成一个填充器,可以通过 Artisan 命令 make:seeder。所有框架生成的填充器都位于 database/seeders目录:
php artisan make:seeder TestTableSeeder
在run方法下调用定义的工厂
<?php
use Illuminate\Database\Seeder;
class TestTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
/*factory(App\Test::class, 50)->create()->each(function($test) {
$test->posts()->save(factory(App\Test::class)->make());
});*/
factory(App\Test::class,3)->create();
}
}
使用命令
php artisan db:seed --class=TestTableSeeder
模型关联#
在本例中,我们还会增加关联至我们所创建的模型。当使用 create方法创建多个模型时,它会返回一个 Eloquent 集合实例,让你能够使用集合所提供的便利函数,像是 each:
$users = factory(App\User::class, 3)
->create()
->each(function ($u) {
$u->posts()->save(factory(App\Post::class)->make());
});
你也可以使用闭包参数来创建模型关联。例如如果你想在创建一个 Post 的顺便创建一个 User 实例:
$factory->define(App\Post::class, function ($faker) {
return [
'title' => $faker->title,
'content' => $faker->paragraph,
'user_id' => function () {
return factory(App\User::class)->create()->id;
}
];
});