技術 4 分鐘閱讀
用 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