laravel-faker

Laravel 5 使用 Seeder & Faker 生成假数据

还在为手动填写假数据而头疼吗?Laravel 使用 Faker 可以很灵活的添加所需的特定格式的数据,可以通过 tinker 命令行预览、保存测试数据,也可以直接在 Seed 中写好相应代码一键生成。所有的 seeder 文件在 database/seeds 目录下。

Faker 是一个 PHP 库,为您生成假数据

laravel 框架默认引入了 fzaninotto/Faker 包,这个包能让我们快速的生成一些测试数据。本地化

packages
composer require fzaninotto/faker

创建 seeder 文件

1
php artisan make:seeder UserTableSeeder

用 laracasts/generators 包创建文件

1
2
3
4
5
6
7
8
9
10
11
// 步骤1:通过Composer安装
composer require laracasts/generators --dev

// 步骤2:添加服务提供商
// 添加提供者 app/Providers/AppServiceProvider.php
public function register()
{
if ($this->app->environment() == 'local') {
$this->app->register('Laracasts\Generators\GeneratorsServiceProvider');
}
}

命令

1
2
3
make:migration:schema
make:migration:pivot
make:seed

迁移与模式

1
php artisan make:migration:schema create_articles_table --schema="title:string, conent:text, published_at:timestamp"

创建如下文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateArticlesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('articles', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->text('content');
$table->timestamp('published_at');
$table->timestamps();
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('articles');
}
}

删除

1
php artisan make:migration:schema remove_published_at_from_articles_table --schema="published_at:timestamp"

创建如下文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class RemovePublishedAtFromArticlesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('articles', function (Blueprint $table) {
$table->dropColumn('published_at');
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('articles', function (Blueprint $table) {
$table->timestamp('published_at');
});
}
}

多对多关系

1
php artisan make:migration:pivot tags articles

创建如下文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateArticleTagPivotTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('article_tag', function (Blueprint $table) {
$table->integer('article_id')->unsigned()->index();
$table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade');
$table->integer('tag_id')->unsigned()->index();
$table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');
$table->primary(['article_id', 'tag_id']);
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('article_tag');
}
}

用 laravel-test-factory-helper 包自动生成属性

该软件包可帮助您从现有的模型/数据库结构生成模型工厂,以便更快速地测试Laravel应用程序

1
composer require mpociot/laravel-test-factory-helper

config/app.php 添加服务提供商

1
Mpociot\LaravelTestFactoryHelper\TestFactoryHelperServiceProvider::class

执行

1
2
// database/factory/ModelFactory.php 模型工厂文件会自动生成各个模型对应字段数据
php artisan test-factory-helper:generate

安全保证

在 .env 文件中的 APP_ENV 配置通常可以配置以下三个值

1
2
3
4
5
6
// local 代表本地环境
APP_ENV=local
// testing 代码测试环境
APP_ENV=testing
// production 代表线上环境
APP_ENV=production

执行 seed

使用 php artisan make:seeder 命令来创建数据时,会调用 database/seeders 目录下的 DatabaseSeeder.php 文件中的 run() 方法。生成数据的代码可以放在 run() 中,既支持 DB 操作,也支持 Factory 方法,在 run() 中使用 call() 函数一次性来添加操作方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
if (App::environment('production', 'staging'))
{
// 线上环境
exit('你不会是想被开除吧 ?');
}

DB::table('users')->truncate();
DB::table('articles')->truncate();
$this->call(UserTableSeeder::class);

factory(\App\Article::class,50)->create();

// 直接在这写
/*\App\User::truncate();
factory(\App\User::class,20)->create();*/
}
}
1
2
3
// 执行这一步如果出现错误: 出现 [ReflectionException] Class does not exist 的提示。
// 在终端中执行 composer dump-autoload 即可
php artisan db:seed

学习参考

叶子天堂互联
检测当前环境
有用的数据填充

如果对您有用,请博主喝杯咖啡!

热评文章