LaravelDocs(中文)

資料庫:Seeding

Laravel 提供使用 seed 類別來填充資料庫資料的功能

介紹 (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