技術 4 分鐘閱讀

用 Laravel Seeder 產生逼真的中文假資料

用 Laravel Seeder 產生逼真的中文假資料

為什麼需要假資料?

開發階段需要大量測試資料,但手動輸入實在太慢。Laravel 內建的 Seeder 搭配 Faker 可以一鍵產生成千上萬筆逼真的假資料。最近在做一個餐廳訂位系統的專案,就大量使用了這個技巧。

基本設定

設定中文語系

config/app.php 或直接在 Factory 中指定 Faker 的語系:

// config/app.php
'faker_locale' => 'zh_TW',

這樣 Faker 就會產生繁體中文的姓名、地址等資料。

建立 Factory

php artisan make:factory CustomerFactory
// database/factories/CustomerFactory.php
class CustomerFactory extends Factory
{
    public function definition(): array
    {
        return [
            'name' => fake()->name(),
            'email' => fake()->unique()->safeEmail(),
            'phone' => fake()->phoneNumber(),
            'address' => fake()->address(),
            'company' => fake()->company(),
            'note' => fake()->realText(100),
            'created_at' => fake()->dateTimeBetween('-1 year', 'now'),
        ];
    }
}

建立 Seeder

php artisan make:seeder CustomerSeeder
// database/seeders/CustomerSeeder.php
class CustomerSeeder extends Seeder
{
    public function run(): void
    {
        Customer::factory()
            ->count(50)
            ->create();
    }
}

帶有關聯的 Seeder

如果需要產生有關聯的資料,例如顧客和訂單:

class OrderSeeder extends Seeder
{
    public function run(): void
    {
        Customer::factory()
            ->count(30)
            ->has(
                Order::factory()
                    ->count(rand(1, 5))
                    ->state(function (array $attributes, Customer $customer) {
                        return ['customer_name' => $customer->name];
                    })
            )
            ->create();
    }
}

在 DatabaseSeeder 中統一管理

// database/seeders/DatabaseSeeder.php
class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        $this->call([
            CustomerSeeder::class,
            OrderSeeder::class,
            ProductSeeder::class,
        ]);
    }
}

執行:

php artisan db:seed

# 或重建資料庫 + 填充
php artisan migrate:fresh --seed

自訂 Faker Provider

Faker 內建的中文資料有限,有時需要自訂。例如產生台灣常見的餐廳名稱:

// database/factories/RestaurantNameProvider.php
class RestaurantNameProvider extends Base
{
    protected static $names = [
        '阿明', '老王', '小林', '阿嬤的',
    ];

    protected static $types = [
        '牛肉麵', '滷肉飯', '小籠包', '咖啡廳',
    ];

    public function restaurantName(): string
    {
        return static::randomElement(static::$names)
             . static::randomElement(static::$types);
    }
}

實用小技巧

  • fake()->unique() 確保資料不重複
  • fake()->optional(0.3) 讓 30% 的機率產生 null
  • fake()->dateTimeBetween('-6 months', 'now') 產生合理的時間範圍
  • 搭配 Docker 環境 可以隨時重建乾淨的測試資料

小結

善用 Seeder 和 Faker 能大幅提升開發效率,特別是在需要展示給客戶看 demo 的時候,逼真的假資料比空白頁面有說服力多了。

如果你需要類似的系統,歡迎聯繫討論。

#Laravel #Seeder #Faker
Thousand Lab

Thousand Lab