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;
use Illuminate\Support\Facades\DB;
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コマンドでシードデータをテーブルに作成する