跳轉至內容

資料庫:資料填充

簡介

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 Seeder
11{
12 /**
13 * Run the database seeders.
14 */
15 public function run(): void
16 {
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(): void
16 {
17 $this->call([
18 UserSeeder::class,
19 ]);
20 }
21}

執行填充器

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

1php artisan db:seed
2 
3php artisan db:seed --class=UserSeeder

你還可以結合使用 migrate:fresh 命令和 --seed 選項來填充資料庫,這將刪除所有表並重新執行所有遷移。此命令對於徹底重建資料庫非常有用。--seeder 選項可用於指定要執行的特定填充器。

1php artisan migrate:fresh --seed
2 
3php artisan migrate:fresh --seed --seeder=UserSeeder

強制在生產環境中執行填充器

某些填充操作可能會導致資料變更或丟失。為了防止在生產資料庫中意外執行填充命令,系統會在 production 環境中執行填充器之前提示你進行確認。若要強制執行填充器而不進行提示,請使用 --force 標誌。

1php artisan db:seed --force