Laravel - 10. シーディング

データベースのマイグレーションができたので、次は messages テーブルに初期データを登録しておきましょう。ここでは次のような3件のデータを登録するものとします。

ID 内容 更新日時 作成日時
1 Hello 2020/09/01 00:00:00 2020/09/01 00:00:00
2 Bonjour 2020/09/01 00:00:00 2020/09/01 00:00:00
3 Ciao 2020/09/01 00:00:00 2020/09/01 00:00:00

このようなデータを登録するために、直接INSERT文を記述して messages テーブルにデータを登録することもできますが、Laravelはシーディングという仕組みで初期データを準備できます。シーディングは php artisan make:seeder コマンドでシードファイルを作成し、 php artisan db:seed コマンドでシードファイルに記述したデータをテーブルに反映します。

まずは php artisan make:seeder コマンドを確認しておきましょう。

$ php artisan make:seeder シードクラス名

php artisan make:seeder コマンドにはシードクラス名を指定します。シードクラス名には任意の名前を付けることができますが、ここでは messages テーブルのシードクラスを作るので MessagesSeeder という名前を指定することにします。

$ php artisan make:seeder MessagesSeeder
Seeder created successfully.

コマンドが成功すると database/seeds/MessagesSeeder.php ファイルが生成されます。テキストエディタで database/seeds/MessagesSeeder.php ファイルを開いてみましょう。

<?php

use Illuminate\Database\Seeder;

class MessagesSeeder extends Seeder
{
    public function run()
    {
        //
    }
}

生成された MessagesSeeder クラスは Seeder クラスを継承しています。 MessagesSeeder クラスの run メソッドに初期データを登録する処理を実装します。

<?php

use Illuminate\Database\Seeder;

class MessagesSeeder extends Seeder
{
    public function run()
    {
        DB::table("messages")->insert([
            ["text" => "Hello", 
            "updated_at" => "2020/09/01 12:34:56", "created_at" => "2020/09/01 12:34:56"],
            ["text" => "Bonjour", 
            "updated_at" => "2020/09/01 12:34:56", "created_at" => "2020/09/01 12:34:56"],
            ["text" => "Ciao", 
            "updated_at" => "2020/09/01 12:34:56", "created_at" => "2020/09/01 12:34:56"],
        ]);
    }
}

ここでは DB::table("messages")->insert メソッドを使って messages テーブルに3件のレコードを登録しています。このように DB ファサードを使って初期データを登録できます。

次にシーディングを管理する database/seeds/DatabaseSeeder.php ファイルを見てみましょう。

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        // $this->call(UsersTableSeeder::class);
    }
}

DatabaseSeeder クラスはシーディングの実行を管理するプログラムです。このファイルから先ほどの MessagesSeeder クラスを呼び出すように実装します。 DatabaseSeeder クラスの run メソッドにはコメントアウトされている処理があるので、このコメントを参考に先ほど作成した MessagesSeeder クラスを呼び出します。

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $this->call(MessagesSeeder::class);
    }
}

以上でシードファイルの準備は完了です。

シードデータの登録

続いて php artisan db:seed コマンドで作成したシードファイルから初期データを登録してみましょう。

$ php artisan db:seed
Seeding: MessagesSeeder
Seeded:  MessagesSeeder (0.1 seconds)
Database seeding completed successfully.

上記のようにメッセージが出力されれば初期データの登録は完了です。実際にデータベースに接続して messages テーブルの定義を確認してみましょう。ここではPostgreSQLのクライアントツールを起動して以下のようにコマンドを入力します。

laravel=# select * from messages;
 id |  text   |     created_at      |     updated_at
----+---------+---------------------+---------------------
  1 | Hello   | 2020-09-01 12:34:56 | 2020-09-01 12:34:56
  2 | Bonjour | 2020-09-01 12:34:56 | 2020-09-01 12:34:56
  3 | Ciao    | 2020-09-01 12:34:56 | 2020-09-01 12:34:56
(3 rows)

SQLの実行結果からシードファイルに定義した3件のレコードが登録されていることがわかります。

まとめ

  • シーディングはテーブルの初期データを登録する仕組み
  • php artisan make:seeder コマンドでシードファイルを作成する
  • php artisan db:seed コマンドでシードデータをテーブルに作成する