資料庫:資料填充
簡介
Laravel 包含了使用資料填充類別來填充資料庫資料的能力。所有的資料填充類別都儲存在 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 來達成這個目的。當使用時,WithoutModelEvents
trait 可以確保不會發送任何模型事件,即使透過 call
方法執行額外的資料填充類別也是如此。
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