資料庫:資料填充
簡介
Laravel 具備使用填充類(seed classes)向資料庫填充資料的能力。所有的填充類都存放在 database/seeders 目錄中。預設情況下,系統為你定義了一個 DatabaseSeeder 類。在這個類中,你可以使用 call 方法來執行其他填充類,從而控制資料填充的順序。
在資料庫填充期間,批次賦值保護會自動停用。
編寫填充器
要生成一個填充器,請執行 make:seeder Artisan 命令。框架生成的所有填充器都將被放置在 database/seeders 目錄中。
1php artisan make:seeder UserSeeder
預設情況下,填充類只包含一個方法:run。當執行 db:seed Artisan 命令時,該方法會被呼叫。在 run 方法中,你可以根據需要向資料庫插入資料。你可以使用 查詢構建器 手動插入資料,也可以使用 Eloquent 模型工廠。
作為示例,讓我們修改預設的 DatabaseSeeder 類,並在 run 方法中新增一個數據庫插入語句。
1<?php 2 3namespace Database\Seeders; 4 5use Illuminate\Database\Seeder; 6use Illuminate\Support\Facades\DB; 7use Illuminate\Support\Facades\Hash; 8use Illuminate\Support\Str; 9 10class DatabaseSeeder extends Seeder11{12 /**13 * Run the database seeders.14 */15 public function run(): void16 {17 DB::table('users')->insert([18 'name' => Str::random(10),19 'email' => Str::random(10).'@example.com',20 'password' => Hash::make('password'),21 ]);22 }23}
你可以在 run 方法的簽名中對所需的任何依賴項進行型別提示。它們將自動透過 Laravel 服務容器 進行解析。
使用模型工廠
當然,為每個模型填充手動指定屬性是很麻煩的。相反,你可以使用 模型工廠 來便捷地生成大量資料庫記錄。首先,請查閱 模型工廠文件,瞭解如何定義你的工廠。
例如,讓我們建立 50 個使用者,每個使用者都關聯一篇文章。
1use App\Models\User; 2 3/** 4 * Run the database seeders. 5 */ 6public function run(): void 7{ 8 User::factory() 9 ->count(50)10 ->hasPosts(1)11 ->create();12}
呼叫其他填充器
在 DatabaseSeeder 類中,你可以使用 call 方法來執行其他的填充類。使用 call 方法可以將資料庫填充任務拆分到多個檔案中,這樣就不會使單個填充類變得過於龐大。call 方法接受一個要執行的填充類陣列。
1/** 2 * Run the database seeders. 3 */ 4public function run(): void 5{ 6 $this->call([ 7 UserSeeder::class, 8 PostSeeder::class, 9 CommentSeeder::class,10 ]);11}
靜默模型事件
在執行填充時,你可能希望防止模型觸發事件。你可以透過使用 WithoutModelEvents trait 來實現這一點。使用後,即使透過 call 方法執行了額外的填充類,WithoutModelEvents trait 也能確保模型事件不會被觸發。
1<?php 2 3namespace Database\Seeders; 4 5use Illuminate\Database\Seeder; 6use Illuminate\Database\Console\Seeds\WithoutModelEvents; 7 8class DatabaseSeeder extends Seeder 9{10 use WithoutModelEvents;11 12 /**13 * Run the database seeders.14 */15 public function run(): void16 {17 $this->call([18 UserSeeder::class,19 ]);20 }21}
執行填充器
你可以執行 db:seed Artisan 命令來填充資料庫。預設情況下,db:seed 命令會執行 Database\Seeders\DatabaseSeeder 類,該類隨後可能會呼叫其他填充類。不過,你可以使用 --class 選項來指定要單獨執行的特定填充類。
1php artisan db:seed2 3php artisan db:seed --class=UserSeeder
你還可以結合使用 migrate:fresh 命令和 --seed 選項來填充資料庫,這將刪除所有表並重新執行所有遷移。此命令對於徹底重建資料庫非常有用。--seeder 選項可用於指定要執行的特定填充器。
1php artisan migrate:fresh --seed2 3php artisan migrate:fresh --seed --seeder=UserSeeder
強制在生產環境中執行填充器
某些填充操作可能會導致資料變更或丟失。為了防止在生產資料庫中意外執行填充命令,系統會在 production 環境中執行填充器之前提示你進行確認。若要強制執行填充器而不進行提示,請使用 --force 標誌。
1php artisan db:seed --force