【Laravel】シーダーとは:データベースへテストデータや初期値の登録

時計 2023.12.02 / 時計

【Laravel】シーダーとは:データベースへテストデータや初期値の登録

記事ではLaravelシーダー(Seeder)について詳しく解説していきます。

Webアプリケーション開発では、本番運用しているサーバーにデプロイする前にテストを行う必要があります。テストにはテーブルにある程度のテストデータを準備しておくべきです。

Laravelではテスト用のテストデータを作成する機能としてシーダーという機能が用意されています。またシーダーを使うことでデプロイ後の初期値も簡単に用意することもできます。

本記事を通して、Laravelのシーダーや使い方について理解を深めてください。

Laravel:シーダーとは

シーダー(seeder)とはデータベースのテーブルにデータの初期値(マスタデータ)を登録したり、テスト用のダミーデータを登録できる機能です。

マイグレーションを実行してテーブルを用意したあとはテーブルにレコードは一つも用意されていません。このままではアプリの動作確認がうまくできないことがあるため、シーダーを使ってダミーデータを登録します。

Laravel用語の確認

マイグレーションとはデータベースのスキーマ(構造)を管理するための機能です。データベーススキーマをコードで表現し、それをデータベースに反映することができます

このような初期値やダミーデータを登録する機能は「シーダー」や「シーディング」と呼ばれます。シーダー(Seeder)とは日本語で「種をまく人」という意味です。

シーダーは以下の流れで行います。

シーダーを行う流れ
  1. シーダーファイルの作成(コマンドの実行)
  2. シーダーファイルの編集
  3. シーダーの実行

シーダーではシーダーファイルを利用してレコードを追加していきます。シーダーファイルはプロジェクトのdatabase/seedersフォルダ内に保存します。この中にシーダーファイルを作成する、または最初から用意されているDatabaseSeeder.phpを利用してシーダーの実行を行います。

シーダーファイルの作成

シーダーではまずテーブルにデータを追加するためのシーダーファイルを作成します。シーダーファイルは以下構文に沿ってコマンドプロンプトからコマンドを実行することで自動作成されます。

構文

php artisan make:seeder シーダーファイル名

例えばproductsテーブルのシーダーファイルを作成する場合は次のようにコマンドを実行します。

php artisan make:seeder ProductSeeder

上記コマンドを実行すると、「database/seeders」内にProductSeeder.phpが作成されます。ファイルのソースコードは以下の通りです。

<?php

namespace Database\Seeders;

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

class ProductSeeder extends Seeder
{
    public function run(): void
    {
        //
    }
}

シーダーファイルのrun()メソッドにテーブルに挿入するデータを定義していきます。

シーダーファイルの編集

新規作成したProductSeeder.phpのrun()メソッドに以下のようにテーブルに挿入するデータを定義します。ここではproductsテーブルには3つのフィールド「title」「description」「price」があるとします。

class ProductSeeder extends Seeder
{
    public function run(): void
    {
        \App\Models\Product::create([
            'title' => 'office54',
            'description' => 'Popular goods',
            'price' => '54',
        ]);
    }
}

上記ではモデルを利用してデータを挿入しています。または以下のようにDBファサードのクエリビルダを使ってデータを挿入することもできます。

use Illuminate\Support\Facades\DB;// 追加
…
public function run(): void
{
    \DB::table('products')->insert([
        [
            'title' => 'office54',
            'description' => 'Popular goods',
            'price' => '54',
        ],
        [
            'title' => 'office55',
            'description' => 'Popular goods',
            'price' => '55',
        ],
    ]),
}
POINT

DBファサードを利用する方法では複数のデータを簡単に挿入できます

DBファサードとは

DBファサードとはデータベース操作に必要な機能をまとめたクラスのファサードです。

Illuminate\Support\Facadesに用意されているファサードであり、クラス名は「DB」です。DBクラスには様々なメソッドが備わっており、メソッドを呼び出してデータベース操作を行います。

DBファサードでは「クエリビルダ」という機能が備わっており、メソッドチェーンを使って最適化したクエリを実行できます。DBファサードのクエリビルダについて詳しくは以下記事をご参照ください。

シーダーの実行

シーダーファイルで定義したデータをデータベースに追加するために、シーダーの実行を行います。シーダーの実行には以下2つの方法があります。

  1. DatabaseSeeder.phpのrun()メソッドを実行する
  2. シーダーファイルを指定して実行する

それぞれの方法について次項より詳しく解説していきます。

DatabaseSeeder.phpのrun()メソッドを実行する

デフォルトで用意されているDatabaseSeeder.phpから作成したシーダーファイルを呼び出してシーダーを実行する方法があります。

「database/seeders」内にあるDatabaseSeeder.phpのrun()メソッドに次のようにcall()で作成したシーダーファイルを呼び出せるように記述しましょう。

構文

$this->call(シーダークラス::class);

public function run()
{
    $this->call(ProductSeeder::class);
}

上記のようにcall()メソッドの引数にシーダークラスのclassプロパティを指定して呼び出します。DatabaseSeeder.phpにシーダーファイルの呼び出しを記述したら以下コマンドを実行します。

php artisan db:seed

上記コマンドによってDatabaseSeeder.php内のrun()メソッドが実行され、作成したシーダーファイルが実行されデータがテーブルに挿入される流れとなっています。

シーダーファイルを個別に指定して実行する

作成したシーダーファイルを個別に指定して実行する方法もあります。作成したシーダーの実行は以下構文に沿ったコマンドを実行します。

構文

php artisan db:seed –-class=クラス名

--classオプションをコマンドに付けることで、指定したシーダーファイルのクラスを実行します。

POINT

--classオプションを付けなかった場合はDatabaseSeederのrun()メソッドが実行されます。

ここではProductSeeder.phpを指定してコマンドを実行してみます。

php artisan db:seed –-class=ProductSeeder

データベースの再構築

データベースからすべてのテーブルを削除して、一からマイグレーションを実行する場合は「php artisan migrate:fresh」コマンドを実行します。

このコマンドでデータベースを再構築できますが、コマンドにオプション「--seed」を付けることで同時にシーダーも実行してくれます。

php artisan migrate:fresh --seed

シーダーでユーザーを登録する

シーダーでユーザーを登録したい場合は次のように記述します。ここでは最初からLaravelに用意されているusersテーブルにユーザーを登録しています。

<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;

class UserSeeder extends Seeder
{
    public function run(): void
    {
        \App\Models\User::create([
            'name' => 'Administrator',
            'email' => 'office54@office54.net',
            'password' => Hash::make('password'),
        ]);
    }
}
POINT

パスワードではHashクラスを使ってパスワードをハッシュ値に変換してテーブルに登録します