概要
シーディングはデータベースを管理する機能の1つで、データベース構築時にダミーデータや初期データを作成するために使われます。
生成したい内容をクエリビルダで作成することにより、自動でレコードを生成することができます。
シーディングは以下のような段階で構成されます。
1.シーディングのためのシーダークラスを作成する。
2.シーディングコマンドを実行する。
シーダークラスの作成
ここでは前回の[【laravel】マイグレーション]
(https://qiita.com/gone0021/items/5cec0c945b41c00441cc)で作成したSampleテーブルの内容を例に記述していきます。
コマンド
マイグレーションのファイルはartisanコマンドで作成します。
ファイル名(クラス名)の指定はありませんが、テーブル名と合わせた名前でシーダーファイルを作成していきます。
php artisan make:seeder SampleTabaleSeeder
ディレクトリ構造
database\seeds内にコマンドで作成したファイル名のファイルが作成されます。
database
├─ seeds
├─ SampleTabaleSeeder.php
作成されるファイル
artisanコマンドで作成した場合は以下のような内容が自動で作成されます。
Illuminate\Database\Seeder
クラスを継承したシーダークラスとなっています。
シーダーファイルにはvoid型のrunメソッドが用意されており、ここに処理を記述していきます。
<?php
use Illuminate\Database\Seeder;
class SampleSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//
}
}
シーダーの作成
ダミーレコードを作成します。
ここではクエリビルダで記述するため、DBファサードをuseします。
また、idはオートインクリメントのため省略して記述していきます。
クリエビルダについては【laravel】データベースの操作 / クリエビルダによる操作をご参考ください。
use Illuminate\Support\Facades\DB;
public function run() {
$param = [
'name' => 'サンプル太郎',
'tel' => '09012345678',
'address' => '〇〇県☓☓市',
'wmail' => 'taro_sample@mail.com',
'is_experience' => 1,
];
DB::table('people')->insert($param);
// 中略...
// 記述方法:DB::table('テーブル名')->insert(パラメータ);
}
シーディングの準備
シーダークラスを作成したので、シーディングを実行してレコードを生成します。
そのためにはDatabaseSeederで実効するシーダークラスを指定する必要があります。
DatabaseSeederはdatabase\seedsにデフォルトで用意されています。
ディレクトリ構造
database\seedsにデフォルトで用意されています。
database
├─ seeds
├─ DatabaseSeeder.php
DatabaseSeederファイルの中身
作成したシーダークラスと同じくSeederクラスを継承したクラスとなっています。
runメソッドに実効するシーダークラスを指定します。
シーダークラスと同じメソッドなのでコメント部分は割愛します。
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run()
{
// $this->call(UsersTableSeeder::class);
}
}
シーダークラスの登録
runメソッドにcall
メソッドを記述します。
callメソッドは実行するシーダークラスを引数にして記述します。
public function run()
{
$this->call(SampleTableSeeder::class);
}
シーディングの実行
シーダークラスを作成してDatabaseSeederへ登録できれば準備は完了で、あとはシーディングを実行するだけです。
シーディングの実行はコマンドで行います。
指定のテーブルにレコードが生成されていればシーディングは完了です。
php artisan db:seed
補足
シーディングはマイグレーションと異なり、重複の確認は行いません。
実行済みのシーダークラスも再度シーディングを実行すれば再度生成されるため、実行済みのシーダークラスはコメントアウトするなどしてデータベースが汚くならないように工夫することをおすすめします。
参考
[データベース:シーディング]
(https://readouble.com/laravel/6.x/ja/seeding.html)
[【PHP/Laravel入門】動作チェックに便利なシーディング使い方まとめ]
(https://www.sejuku.net/blog/61041)