資料庫:Seeding
簡介
Laravel 包含使用 seed 類別為資料庫填充資料的能力。所有的 seed 類別都儲存在 database/seeders
目錄中。預設情況下,會為您定義一個 DatabaseSeeder
類別。在這個類別中,您可以使用 call
方法來執行其他的 seed 類別,讓您能夠控制 seed 的執行順序。
在資料庫 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'), ]); }}
您可以在 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