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コマンドでシードデータをテーブルに作成する