介紹 (Introduction)
Laravel 提供了使用 seed 類別來填充資料庫資料的功能。所有的 seed 類別都儲存在 database/seeders 目錄中。預設情況下,會為您定義一個 DatabaseSeeder 類別。透過這個類別,您可以使用 call 方法來執行其他 seed 類別,讓您可以控制 seeding 的順序。
[!NOTE] 在資料庫 seeding 期間,Mass assignment 保護 會自動停用。
撰寫 Seeders (Writing Seeders)
要產生一個 seeder,請執行 make:seeder Artisan 命令。框架產生的所有 seeders 都將放置在 database/seeders 目錄中:
php artisan make:seeder UserSeeder
Seeder 類別預設只包含一個方法:run。當執行 db:seed Artisan 命令 時,會呼叫這個方法。在 run 方法中,您可以用任何方式將資料插入資料庫。您可以使用 query builder 手動插入資料,或者您可以使用 Eloquent model factories。
作為範例,讓我們修改預設的 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'),
]);
}
}
[!NOTE] 您可以在
run方法的簽章中型別提示任何您需要的依賴項。它們將透過 Laravel service container 自動解析。
使用 Model Factories (Using Model Factories)
當然,手動指定每個 model seed 的屬性是很麻煩的。相反,您可以使用 model factories 來方便地產生大量的資料庫記錄。首先,請查看 model factory 文件 來了解如何定義您的 factories。
例如,讓我們建立 50 個使用者,每個使用者都有一個相關的文章:
use App\Models\User;
/**
* Run the database seeders.
*/
public function run(): void
{
User::factory()
->count(50)
->hasPosts(1)
->create();
}
呼叫額外的 Seeders (Calling Additional 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,
]);
}
靜音 Model Events (Muting Model Events)
在執行 seeds 時,您可能想要防止 models 發送 events。您可以使用 WithoutModelEvents trait 來達成這一點。當使用時,WithoutModelEvents trait 確保不會發送任何 model events,即使透過 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 (Running 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 選項來填充您的資料庫,這將刪除所有資料表並重新執行所有的 migrations。此命令對於完全重建您的資料庫非常有用。--seeder 選項可用於指定要執行的特定 seeder:
php artisan migrate:fresh --seed
php artisan migrate:fresh --seed --seeder=UserSeeder
強制在正式環境中執行 Seeders (Forcing Seeding Production)
某些 seeding 操作可能會導致您更改或遺失資料。為了保護您不會對正式環境資料庫執行 seeding 命令,在 production 環境中執行 seeders 之前會提示您進行確認。要強制 seeders 在沒有提示的情況下執行,請使用 --force 標誌:
php artisan db:seed --force