しばらくブランクがあったのでまとめ直し。
SeederとFactory
Seederはデータベースにデータを(一括)挿入する仕組み。
FactoryはSeederにデータを与える仕組み(通常、Seederの中で呼び出す)。
両者とも便利であることはもちろん、データ生成をプログラムとして定義することで再現性、バージョン管理等が可能としている。
誤解を恐れず言えば、Factoryは必須ではない(Seeder内のプログラムで代用可能)。
利用してみる
Seederファイルの作成
下記のコマンドを実行するとdatabase/seeds/以下にファイルが生成される。
php artisan make:seeder UsersTableSeeder
Seederの登録
生成されたファイルはそのままでは利用できない(db:seedで生成されない)。
db:seedで生成対象とするためにはDatabaseSeeder.phpで登録を行う。
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run()
{
//コメントイン
$this->call(UsersTableSeeder::class);
//必要に応じて他のSeederファイルを追加
//$this->call(AdminTableSeeder::class);
}
}
Seederファイルの編集
run()メソッドに必要な処理を実装する。
Factoryが複数件のダミーデータを生成する用に存在することを考えれば、Seeder自体ではテーブルに存在してほしいユーザーや情報を明示的に指定するのが妥当でしょうかね。
ここではtest1ユーザーを指定した名前、email、パスワードで生成している。
Factoryを利用せずともfor等でループしてもよい。
まあ「絶対こうしろ」というものがわるわけではない。
<?php
use Illuminate\Database\Seeder;
use App\User;
use Faker\Factory as Faker;
class UsersTableSeeder extends Seeder
{
public function run()
{
//一括削除
User::truncate();
//特定のデータを追加
User::create([
'name' => 'test1',
'email' => 'test1@test.com',
'password' => Hash::make('testtest')
]);
//必要ならfaker利用
$faker = Faker::create('en_US');
// $faker = Faker::create('ja_JP');
//必要ならループ(ここをFactory使う)
for($i = 0; $i < 10; $i++){
User::create([
'name' => $faker->name,
'email' => $faker->email,
'password' => Hash::make('testtest')
]);
}
//factoryを利用(結果は上記と同じ)
factory(User::class, 10)->create();
}
}
Factoryはmake:factoryで生成できる。UserFactoryは既にあるので、今回はそれをそのまま利用。
php artisan make:factory UserFactory
Factory already exists!
ファクトリーファイルの中身は下記のような感じ。Fakerが使われている。もちろん必須ではない。
<?php
use Faker\Generator as Faker;
$factory->define(App\User::class, function (Faker $faker) {
return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'password' => Hash::make('testtest'), //使えるパスワードにしておく
'remember_token' => str_random(10),
];
});
Seederの実行。
php artisan db:seed
下記のような感じで生成された(テーブルを一部抜粋)。
test1ユーザーは明示的に生成。
次の10件はforでループ。
次の10件はFactoryで生成されたもの。
+----+-----------------------+-------------------------------+-----------+----------------+
| id | name | email | password | remember_token |
+----+-----------------------+-------------------------------+-----------+----------------+
| 1 | test1 | test1@test.com | $2y$10$zU | NULL |
| 2 | Dr. Dejah Kuhlman Sr. | ebony39@hotmail.com | $2y$10$6N | NULL |
| 3 | Valentina Crist | gibson.lillie@macejkovic.com | $2y$10$zN | NULL |
| 4 | Prof. Colton Haley V | fredrick.mertz@kozey.com | $2y$10$No | NULL |
| 5 | Robin Schmitt | blaze.johnston@gmail.com | $2y$10$0M | NULL |
| 6 | Berniece Bergstrom | kreiger.kenny@greenfelder.com | $2y$10$XB | NULL |
| 7 | Tyrel Hirthe | lilly60@volkman.com | $2y$10$Iw | NULL |
| 8 | Cyrus Upton | whoeger@hotmail.com | $2y$10$O2 | NULL |
| 9 | Prof. Mateo Hahn DVM | jazlyn.schuster@emmerich.com | $2y$10$J9 | NULL |
| 10 | Janick Kulas | lueilwitz.martina@hotmail.com | $2y$10$HT | NULL |
| 11 | Ward Thiel | tyra90@cummings.info | $2y$10$Rt | NULL |
| 12 | Eulalia Skiles | vada.fay@example.org | $2y$10$5g | 8QV0ucwmVZ |
| 13 | Adolf Bogisich | srempel@example.net | $2y$10$4Y | JMv4lcCqeQ |
| 14 | Monserrat Ernser MD | woberbrunner@example.net | $2y$10$bp | ZfuH7DLwyU |
| 15 | Rahsaan Brown PhD | dusty79@example.net | $2y$10$/D | iPx5Tely3r |
| 16 | Kris Collins | xkuhn@example.org | $2y$10$T/ | LnldjSrwLh |
| 17 | Briana Kulas | ben36@example.com | $2y$10$CM | cyrmdEvGYh |
| 18 | Dr. Everett Spencer | ztorphy@example.com | $2y$10$C. | e95b17WjU1 |
| 19 | Elyse Waters | frederic.bode@example.com | $2y$10$TZ | UbfcXQ6Mex |
| 20 | Ali Fahey Jr. | jazlyn.schulist@example.org | $2y$10$RV | EWOsNNcdHJ |
| 21 | Mrs. Madge Macejkovic | shania99@example.com | $2y$10$iW | ELz6HVvDKh |
+----+-----------------------+-------------------------------+-----------+----------------+
Faker自体の使い方はこちらを参考にどうぞ。