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 建立關聯性資料 ?