跳至內容

資料庫:Seeding

簡介

Laravel 包含使用 seed 類別為資料庫填充資料的能力。所有的 seed 類別都儲存在 database/seeders 目錄中。預設情況下,會為您定義一個 DatabaseSeeder 類別。在這個類別中,您可以使用 call 方法來執行其他的 seed 類別,讓您能夠控制 seed 的執行順序。

lightbulb

在資料庫 seeding 期間,會自動停用大量賦值保護

撰寫 Seeders

若要產生一個 seeder,請執行 make:seeder Artisan 命令。框架產生的所有 seeders 都會放置在 database/seeders 目錄中。

php artisan make:seeder UserSeeder

一個 seeder 類別預設只包含一個方法:run。當執行 db:seed Artisan 命令時,會呼叫這個方法。在 run 方法中,您可以隨意將資料插入到您的資料庫。您可以使用查詢產生器來手動插入資料,也可以使用 Eloquent 模型工廠

舉例來說,讓我們修改預設的 DatabaseSeeder 類別,並在 run 方法中新增一個資料庫插入語句

<?php
 
namespace Database\Seeders;
 
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
 
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeders.
*/
public function run(): void
{
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@example.com',
'password' => Hash::make('password'),
]);
}
}
lightbulb

您可以在 run 方法的簽名中類型提示您需要的任何相依性。它們將透過 Laravel 服務容器自動解析。

使用模型工廠

當然,手動指定每個模型 seed 的屬性是很麻煩的。相反地,您可以使用 模型工廠來方便地產生大量的資料庫記錄。首先,請檢閱模型工廠文件,以了解如何定義您的工廠。

例如,讓我們建立 50 個使用者,每個使用者都有一個相關的貼文

use App\Models\User;
 
/**
* Run the database seeders.
*/
public function run(): void
{
User::factory()
->count(50)
->hasPosts(1)
->create();
}

呼叫額外的 Seeders

DatabaseSeeder 類別中,您可以使用 call 方法來執行額外的 seed 類別。使用 call 方法可讓您將資料庫 seeding 分割成多個檔案,這樣就沒有單一的 seeder 類別變得太大。call 方法接受一個應該執行的 seeder 類別陣列

/**
* Run the database seeders.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
PostSeeder::class,
CommentSeeder::class,
]);
}

靜音模型事件

在執行 seed 時,您可能想要防止模型觸發事件。您可以使用 WithoutModelEvents trait 來達成此目的。當使用時,WithoutModelEvents trait 會確保不會觸發任何模型事件,即使透過 call 方法執行額外的 seed 類別也是如此

<?php
 
namespace Database\Seeders;
 
use Illuminate\Database\Seeder;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
 
class DatabaseSeeder extends Seeder
{
use WithoutModelEvents;
 
/**
* Run the database seeders.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
]);
}
}

執行 Seeders

您可以執行 db:seed Artisan 命令來為您的資料庫填充資料。預設情況下,db:seed 命令會執行 Database\Seeders\DatabaseSeeder 類別,而該類別可能會依序呼叫其他的 seed 類別。不過,您可以使用 --class 選項來指定要單獨執行的特定 seeder 類別

php artisan db:seed
 
php artisan db:seed --class=UserSeeder

您也可以使用 migrate:fresh 命令搭配 --seed 選項來為您的資料庫填充資料,該選項將會刪除所有資料表並重新執行您的所有遷移。此命令對於完全重建資料庫很有用。--seeder 選項可以用來指定要執行的特定 seeder

php artisan migrate:fresh --seed
 
php artisan migrate:fresh --seed --seeder=UserSeeder

強制在生產環境中執行 Seeders

某些 seeding 操作可能會導致您變更或遺失資料。為了防止您對生產資料庫執行 seeding 命令,在 production 環境中執行 seeders 之前,系統會提示您進行確認。若要強制 seeders 在沒有提示的情況下執行,請使用 --force 旗標

php artisan db:seed --force