iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 9
1

昨天介紹完資料庫建置,今天就來幫資料庫填充測試資料。

簡介

Laravel 可以簡單的使用 seed 類別,填充測試用的資料至資料庫。所有的 seed 類別放在 database/seeds 目錄下。你可以任意地為 Seed 類別命名,但是應該遵守某些大小寫規範,像是 UserTableSeeder 之類。預設已經為你生成了一個 DatabaseSeeder 。在這個類別裡,你可以使用 call 方法執行其他的 seed ,藉此控制資料填充的順序。

撰寫資料填充

你可以透過 Artisan 指令的 make:seeder 來生成一個 Seeder。所有透過框架生成的 Seeder 都將被放置在 database/seeders 路徑。

php artisan make:seeder UsersTableSeeder

在 seeder 類別裡只會預設一個方法:run。當執行 Artisan 指令的 db:seed 時就會呼叫此方法。在 run 方法中,你可以新增任何想要的數據至你的資料庫中。

如同下面的範例,我們修改 Laravel 預先安裝好的 DatabaseSeeder 。我們在 run 方法中添加了一段在資料庫新增數據的語法:

<?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')->insert([
            'name' => str_random(10),
            'email' => str_random(10).'@gmail.com',
            'password' => bcrypt('secret'),
        ]);
    }
}

使用模型工廠

手動為每一個 seed 模型一一指定屬性是很麻煩的。作為替代方案,你可以使用 模型工廠 幫你輕鬆地生成大量的資料。

模型工廠

測試時,常常需要在執行測試之前寫入一些資料到資料庫中。建立測試資料時,除了手動設定每個欄位的值,Laravel 讓你可以使用 Eloquent 模型的「工廠」設定每個屬性的預設值。開始之前,你可以查看應用程式的database/factories/ModelFactory.php 檔案。
以下為產生假使用者的factory:

<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */
use App\User;
use Illuminate\Support\Str;
use Faker\Generator as Faker;

$factory->define(User::class, function (Faker $faker) {
    static $password;

    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'password' => $password ?: $password = bcrypt('secret'),
    ];
});

其中,$faker這個函式可以幫我們回傳一些「類似真實世界」的測試資料。

當我們要產生多個使用者資料的時候,只要到DatabaseSeeder加上要呼叫的factory,以及要生成的資料數量即可。
舉例來說,讓我們創建 50 個使用者:

<?php

use Illuminate\Database\Seeder;

use Faker\Generator as Faker;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        factory(App\User::class, 50)->create();
    }
}

執行資料填充

一旦你撰寫完你的 seeder ,可以使用Artisan 指令的 db:seed 來對資料庫進行資料填充。在預設的情況下,db:seed 指令將運行 DatabaseSeeder 類別,並透過它來呼叫其他的 seed 類別。但是,你也可以使用 --class 選項來單獨運行一個特別指定的 seeder 類別:

php artisan db:seed

php artisan db:seed --class=UserTableSeeder

你也可以使用 migrate:refresh 指令來對資料庫進行資料填充,它會推回並再次執行所有遷移。在完全重建你的資料庫時這個指令是非常有用的:

php artisan migrate:refresh --seed

上一篇
DAY8 --- Laravel資料庫遷移(migration)
下一篇
DAY10 --- Eloquent: ORM
系列文
砍掉重練啦! 森林系男孩之後端工程師潛水App挑戰計畫27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言