資料庫:資料填充
📝 此頁面為 Laravel 官方文檔的繁體中文翻譯。查看原始英文版本
資料庫:資料填充
簡介
Laravel 包含使用 seed 類別為資料庫填充資料的能力。所有 seed 類別都儲存在 database/seeders 目錄中。預設情況下,為您定義了一個 DatabaseSeeder 類別。從此類別中,您可以使用 call 方法來執行其他 seed 類別,從而控制填充順序。
[!NOTE] 大量賦值保護在資料庫填充期間會自動停用。
編寫 Seeder
要生成一個 seeder,請執行 make:seeder Artisan 命令。框架生成的所有 seeder 都將放在 database/seeders 目錄中:
php artisan make:seeder UserSeeder
一個 seeder 類別預設只包含一個方法:run。當執行 db:seed Artisan 命令時會呼叫此方法。在 run 方法中,您可以以任何方式將資料插入資料庫。您可以使用查詢建構器手動插入資料,也可以使用 Eloquent 模型工廠。
例如,讓我們修改預設的 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 服務容器自動解析。
使用模型工廠
當然,手動指定每個模型填充的屬性是很繁瑣的。相反,您可以使用模型工廠來方便地生成大量資料庫記錄。首先,查看模型工廠文件以了解如何定義您的工廠。
例如,讓我們建立 50 個使用者,每個使用者有一篇關聯的文章:
use App\Models\User;
/**
* Run the database seeders.
*/
public function run(): void
{
User::factory()
->count(50)
->hasPosts(1)
->create();
}
呼叫其他 Seeder
在 DatabaseSeeder 類別中,您可以使用 call 方法來執行額外的 seed 類別。使用 call 方法允許您將資料庫填充分成多個檔案,這樣就不會有單一 seeder 類別變得太大。call 方法接受應執行的 seeder 類別陣列:
/**
* Run the database seeders.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
PostSeeder::class,
CommentSeeder::class,
]);
}
靜音模型事件
在執行填充時,您可能希望阻止模型派發事件。您可以使用 WithoutModelEvents trait 來實現。使用時,WithoutModelEvents trait 確保不會派發任何模型事件,即使透過 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,
]);
}
}
執行 Seeder
您可以執行 db:seed Artisan 命令來填充資料庫。預設情況下,db:seed 命令執行 Database\Seeders\DatabaseSeeder 類別,該類別又可以呼叫其他 seed 類別。但是,您可以使用 --class 選項來指定要單獨執行的特定 seeder 類別:
php artisan db:seed
php artisan db:seed --class=UserSeeder
您也可以使用 migrate:fresh 命令配合 --seed 選項來填充資料庫,這將刪除所有表並重新執行所有遷移。此命令對於完全重建您的資料庫非常有用。可以使用 --seeder 選項來指定要執行的特定 seeder:
php artisan migrate:fresh --seed
php artisan migrate:fresh --seed --seeder=UserSeeder
強制 Seeder 在生產環境中執行
某些填充操作可能會導致您變更或遺失資料。為了保護您免於在生產資料庫上執行填充命令,在 production 環境中執行 seeder 之前會提示您確認。要強制 seeder 在無提示的情況下執行,請使用 --force 標誌:
php artisan db:seed --force