跳到內容

資料庫:資料填充

簡介

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 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 來達成這個目的。當使用時,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(): 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

Laravel 是最有效率的方式來
建構、部署和監控軟體。