前要:laravel5.5数据库迁移可以参考我的上一篇博文:laravel5.5数据库迁移入门实践
一、背景
常常在做项目的过程中,会使用很多的测试数据,而因为团队开发,如果每个人的测试数据都不一致,会出现各种测试问题,所以有必要对数据库中的测试数据也进行开发过程中的版本控制。
填充和迁移类似,都是通过类似于迁移文件一样的填充文件来保存数据和执行填充操作。
填充数据有两种方式,编写seeder填充数据 和 使用模型工厂填充数据。
二、编写seeder填充数据
1. 进入dos系统,跳转到项目根目录,运行 工具(artisan)命令 make:seeder
来生成 Seeder,命令如下:
php artisan make:seeder GoodsTableSeeder
执行结果如下:
由框架生成的 seeders 都将被放置在 /database/seeds
目录下:
文件内容如下:
<?php
use Illuminate\Database\Seeder;
class GoodsTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//
}
}
文件说明:一个seeder文件只包含一个run方法,这个方法会在dos系统中执行 db:seed 命令时被调用执行,在run方法中可以写入要插入的数据。
2. 编写run方法,写入待插入数据
public function run()
{
DB::table('goods')->insert([
'goods_name' => '电动牙刷',
'goods_price'=> '120.23',
'num' => '30',
'descr' => '这是一条测试数据',
]);
}
3. 执行插入数据命令
进入dos系统,执行插入数据命令之前,可能需要重新生成Composer自动加载器,命令如下:
composer dump-autoload
执行插入数据命令
php artisan db:seed --class=GoodsTableSeeder
dos结果如下:
数据库结果如下:
三、使用模型工厂填充数据
在进行数据测试时,有时候需要批量生成数据,单个填充显然不太方便,这时候有需要使用模型工厂填充数据。
1. 生成goods模型文件
为了方便文件统一管理,我们统一把模型文件放在/app/Models/文件夹下,这时候更改一下/config/auth.php下的配置,更改如下:
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class, // 此处更改为App\Models\User
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
注意:因为laravel5.5默认在app文件夹下有一个的User模型文件,所以更改了配置后,如果有需要,可以再重新生成一个User模型文件在Models中。
在dos系统中,跳转到项目根目录,执行命令开始生成goods模型文件,命令如下:
php artisan make:model Models\Goods
2. 在工厂模型文件(/database/factories/ModelFactory.php)中,对指定的字段进行赋值,代码如下:
<?php
use Faker\Generator as Faker;
/*
|--------------------------------------------------------------------------
| Model Factories
|--------------------------------------------------------------------------
|
| This directory should contain each of the model factory definitions for
| your application. Factories provide a convenient way to generate new
| model instances for testing / seeding your application's database.
|
*/
$factory->define(\App\Models\Goods::class, function (\Faker\Generator $faker) {
return [
'goods_name' => $faker->name,
'goods_price' => $faker->numberBetween(100,3000),
'num' => $faker->numberBetween(20,50),
'descr' => $faker->text,
];
});
说明:$fake 实例能够调用的属性,也就是可以生成的数据内容,并非由用户自定义,如 $fake->name 随机生成一个名字,$fake->text 随机生成一个文本,具体的细节,参考github上 PHP library Faker的Formatters部分,地址:https://github.com/fzaninotto/Faker#formatters
3. 生成goods对应的seeder文件
进入dos系统,跳转到项目根目录,执行如下命令:
php artisan make:seed GoodsTableSeeder
执行成功后,查看/database/seeds/文件夹下多出GoodsTableSeeder.php
4. 在GoodsTableSeeder.php文件总的run方法写入生成测试数据的代码,代码如下:
<?php
use Illuminate\Database\Seeder;
class GoodsTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
// 添加单条数据
// DB::table('goods')->insert([
// 'goods_name' => '电动牙刷',
// 'goods_price' => '120.23',
// 'num' => '30',
// 'descr' => '这是一条测试数据',
// ]);
// 添加10条测试数据
$goods = factory(\App\Models\Goods::class,10)->make();
\App\Models\Goods::insert( $goods->toArray() );
}
}
注意:上面代码中添加单条数据是之前编写seeder填充数据时写入的,如果打开这个注释,注释掉批量添加的代码,同样可以重复添加这一条数据。
5. 在/database/seeds/DatabaseSeeder.php 里面调用GoodsSeeder.php的类,代码如下:
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
// $this->call(UsersTableSeeder::class);
$this->call([
GoodsTableSeeder::class,
// UsersTableSeeder::class,
]);
}
}
6. 执行批量生成数据的命令
进入dos系统,跳转至项目根目录,执行以下命令:
php artisan db:seed
ok,批量填充数据也搞定!
结语:数据填充操作主要是用于开发阶段进行数据版本控制和批量产生测试数据的作用,真正到开始运营项目后,这个就不能用了,否则几十万的数据存储在项目文件里面,那就真的是开玩笑了……
如果看博文有什么疑惑的地方,欢迎留言告知!