シーダとは
データベースのテーブルにダミーのレコードを準備する機能
「シーディング」と呼ばれる。これは、シード(最初から用意しておくレコード)を生成する機能
主な手順は3つ
①シーディングのためのシーダーファイルを生成する。
②シーディングファイルを編集してシードを追加していく
③コマンドでシーディングを実行する
シーディングのためのシーダファイルの生成方法
Laravelのappアプリ名ディレクトリ直下で以下のコマンドを実行
php artisan make:seeder ファイル名(例 UserTableSeeder)
database/seedsにファイルが生成されているため編集
DB::table('employees')->insert([
[
'name' => 'テストユーザー1',
'email' => 'test1@example.com',
'password => Hash::make('password'),
],
[
'name' => 'テストユーザー2',
'email' => 'test2@example.com',
'password => Hash::make('password'),
],
[
'name' => 'テストユーザー3',
'email' => 'test3@example.com',
'password => Hash::make('password'),
],
変数にして導入することも可能
<?php
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class AdminTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$param =[
'name' => 'テストユーザー1',
'email' => 'test1@example.com',
'password => Hash::make('password'),
];
DB::table('admins')->insert($param);
}
}
ポイント
パスワードをデータベースに格納する場合はハッシュ化して格納しましょう
'password' => Hash::make('password');
Hash::makeとは
シーダファイルの登録
作成したシーダファイルが実行されるように、デフォルトで用意されているDatabaseSeederに登録する必要がある。
$this->call(シーダクラス::class);
デフォルトのDatabaseSeederに記述を追加していきます。
例えば、UserTableSeederクラスとAdminTableSeederクラスを実行する場合は下記のように記述します。
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$this->call(UserTableSeeder::class);
$this->call(AdminTableSeeder::class);
}
}
実行するシーダークラスのclassをプロパティを引数にして[call]というメソッドを呼び出します。これはSeederクラスにあるメソッドで、これにより指定したクラスのrunメソッドが呼び出され、シーディング処理されるようになります。
シーディングを実行する
以下のコマンドを実行してDatabaseSeederのrunが実行され、そこから各シーダーファイルのrunが呼び出されて実行されます。結果、データベースに格納されているはずです。
php artisan db:seed
個別のseederクラスのみ実行する場合はコマンドでクラスを指定する
php artisan db:seed --class=UsersTableSeeder
シーディングした内容を戻す方法
以下のコマンドを叩く事でロールバック(定義したテーブル全削除)→テーブル再構築→シーディング実行(初期データ投入)までを1つのコマンドで行えます。
php artisan migrate:refresh --seed
大量のデータを格納する場合は、フェイカーとモデルファクトリの利用
もちろんそれぞれのモデルシーダで属性をいちいち指定するのは面倒です。代わりに大量のデータベースレコードを生成するのに便利なモデルファクトリが使用できます。ァクトリが定義できれば、データベースにレコードを挿入するfactoryヘルパ関数が利用できます。
ファクトリーファイルの中でフェイカー使って ダミーデータを作成します。
例として50件のレコードを生成し、それぞれのユーザーへリレーションを付加してみましょう。
php artisan make:factory BookFactory
?php
use Faker\Generator as Faker;
$factory->define(App\Book::class, function (Faker $faker) {
$now = \Carbon\Carbon::now();
return [
'isbn' => $faker->isbn13,
'published_date' => $faker->date($format = 'Y-m-d', $max = 'now'),
'price' => $faker->randomNumber(4),
'created_at' =>$now,
'updated_at' => $now
];
});
シーダーファイルにファクトリの内容を追記
<?php
use IlluminateDatabaseSeeder;
class BooksTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//
factory(AppBooks::class, 50)->create(); //50個のダミーデータを生成
}
}
参考にしたサイト
https://coinbaby8.com/laravel-seeder-factory-faker.html
https://qiita.com/tosite0345/items/1d47961947a6770053af
https://laraweb.net/knowledge/2302/