Laravel 10.x データベース:シーディング

イントロダクション

Laravelは、シードクラスを使用してデータベースにデータをシード(種をまく、初期値の設定)する機能を持っています。すべてのシードクラスはdatabase/seedersディレクトリに保存します。デフォルトで、DatabaseSeederクラスが定義されています。このクラスから、callメソッドを使用して他のシードクラスを実行し、シードの順序を制御できます。

Note: 複数代入は、データベースのシード中では自動的に無効になります。

シーダクラス定義

シーダを生成するには、make:seeder Artisanコマンドを実行します。フレームワークが生成するシーダはすべてdatabase/seedersディレクトリに設置します。

php artisan make:seeder UserSeeder

シーダクラスには、デフォルトで1つのメソッド、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
{
    /**
     * データベースに対するデータ設定の実行
     */
    public function run(): void
    {
        DB::table('users')->insert([
            'name' => Str::random(10),
            'email' => Str::random(10).'@gmail.com',
            'password' => Hash::make('password'),
        ]);
    }
}

Note: runメソッドの引数として、タイプヒントにより必要な依存を指定できます。それらはLaravelのサービスコンテナが自動的に依存解決します。

モデルファクトリの利用

当然それぞれのモデルシーダで属性をいちいち指定するのは面倒です。代わりに大量のデータベースレコードを生成するのに便利なモデルファクトリが使用できます。最初にモデルファクトリのドキュメントを読んで、どのように定義するのかを学んでください。

例として、それぞれに1つの関連する投稿がある50人のユーザーを作成しましょう。

use App\Models\User;

/**
 * データベースに対するデータ設定の実行
 */
public function run(): void
{
    User::factory()
            ->count(50)
            ->hasPosts(1)
            ->create();
}

追加のシーダ呼び出し

DatabaseSeederクラス内で、callメソッドを使用して追加のシードクラスを実行できます。callメソッドを使用すると、データベースのシードを複数のファイルに分割して、単一のシーダークラスが大きくなりすぎないようにできます。callメソッドは、実行する必要のあるシーダークラスの配列を引数に取ります。

/**
 * データベースに対するデータ設定の実行
 */
public function run(): void
{
    $this->call([
        UserSeeder::class,
        PostSeeder::class,
        CommentSeeder::class,
    ]);
}

モデルイベントのミュート

シードの実行中に、モデルがイベントをディスパッチしないようにしたい場合があります。これはWithoutModelEventsトレイトを使って実現できます。WithoutModelEventsトレイトを使うと、たとえcallメソッドで追加のシードクラスが実行されても、モデルのイベントがディスパッチされないようにできます。

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;

class DatabaseSeeder extends Seeder
{
    use WithoutModelEvents;

    /**
     * データベースに対するデータ設定の実行
     */
    public function run(): void
    {
        $this->call([
            UserSeeder::class,
        ]);
    }
}

シーダの実行

db:seed Artisanコマンドを実行して、データベースに初期値を設定します。デフォルトでは、db:seedコマンドはDatabase\Seeders\DatabaseSeederクラスを実行します。このクラスから他のシードクラスが呼び出される場合があります。ただし、--classオプションを使用して、個別に実行する特定のシーダークラスを指定できます。

php artisan db:seed

php artisan db:seed --class=UserSeeder

migrate:freshコマンドを--seedオプションと組み合わせて使用​​してデータベースをシードすることもできます。これにより、すべてのテーブルが削除され、すべてのマイグレーションが再実行されます。このコマンドは、データベースを完全に再構築するのに役立ちます。特定のシーダーの実行を指定するには、--seederオプションを使用します。

php artisan migrate:fresh --seed

php artisan migrate:fresh --seed --seeder=UserSeeder

実働環境でのシーダの強制実行

一部のシード操作により、データが変更または失われる場合があります。本番データベースに対してシードコマンドを実行しないように保護するために、production環境でシーダーを実行する前に確認を求めるプロンプトが表示されます。シーダーをプロンプトなしで強制的に実行するには、--forceフラグを使用します。

php artisan db:seed --force

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる