Laravel 假資料產生工廠

Laravel 假資料產生工廠

你知道 Faker 嗎?

我知道我知道!!

打 LOL 的那個

Faker 是 PHP 產生假資料的 library 他的功能非常強大,幾乎可以應付你所有的需求,不管是文字、數字、圖片、人名只要你想得到的都可以產生出來,那麼就來看看 Laravel 怎麼產生假資料吧。

資料庫結構

在開始之前,先讓我們來產生一張 Articles 這張表來當作範例。
php artisan make:migration create_articles_table

Schema::create('articles', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->string('slug')->unique();
            $table->text('body')->nullable();
            $table->boolean('published')->default(true);
            $table->timestamps();
        });

裡面有我們常用的一些欄位來裝我們的假資料。

建立 Factory 與 Seeder

當我們有資料表後,就可以開始建立 Factory 與 Seeder 了,Factory 我們可以理解為工廠,Factory 會使用 Faker 幫我們產生假資料,至於 Seeder 你去查的話會看到農田的播種機,他在這則會啟動 Factory ,我們一樣可以指令產生這兩個東西。

php artisan make:factory ArticleFactory
artisan 會幫我們產生一些預設的程式碼,我們只要將 Model 替換成 Article,並且定義 Faker 要填入什麼資料

<?php

use Faker\Generator as Faker;
use App\Models\Article;

$factory->define(Article::class, function (Faker $faker) {
    return [
        'title'=>$faker->realText($maxNbChars = 15),
        'slug'=>$faker->slug(),
        'body'=>$faker->realText($maxNbChars = 200),
        'published'=>$faker->boolean($chanceOfGettingTrue = 50),
    ];
});

假資料的格式可以看這裡

接著我們用 Seeder 來告訴 Factory 我們需要多少筆資料,一樣讓我們下 artisan 指令來產生檔案,記得填入 Model 名稱與修改數量。
php artisan make:seeder ArticleTableSeeder

<?php

use Illuminate\Database\Seeder;
use App\Models\Article;

class ArticleTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('articles')->truncate();
        Article::unguard();
        factory(Article::class, 10)->create();
        Article::reguard();
    }
}

我使用 truncate() 來清空我的資料表,不然每執行一次都會增加 10 筆資料。

寫好 Factory 跟 Seeder 就可以來執行 Seeder 了。
php artisan db:seed --class=ArticleTableSeeder

大功告成

在這你可能會遇到 批量賦值(Mass-Assignment) 無法大量寫入的問題,可以去 model 內新增 fillable 屬性,或是像我上面的寫法一樣,用 Model::unguard()Model::reguard() 來解決問題。

結論

如此一來,在開發上 Faker 幫我們省去了上測試資料,就不會沒資料無法撰寫前台樣式的困擾,再用 Laravel Factory Seeder 快速的產生資料,覺得方便許多呢。

參考資料

LARAVEL FAKER產生假資料使用中文
使用 Laravel 数据填充功能生成中文测试数据
如何使用 Model Factory 建立關聯性資料 ?