Laravel ファクトリーを利用したシーディング処理まとめ
Laravelにて、DBを利用する際、ダミーデータを手軽に用意してくれる機能があります。
以下にまとめます。
補足
『PHPフレームワーク Laravel実践開発』 著:掌田津耶乃
の18ページに記載されているSQLを、シーディングとファクトリーを利用して実行するという試みです。
バージョン
Laravel バージョンは6.x
詳細は以下
前提
本には以下の様なSQLを叩いて、ダミーデータを作ってね、と書いてあるが、
自動でそれを行えるようにしたい。
CREATE TABLE `people` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` TEXT NOT NULL,
`mail` TEXT,
`age` INTEGER
);
- dbファイルを作成します。
今回は、こちらにも記載されている
sqlite
で行きます。
$ cd database
$ sqlite3 database/sdatabase.sqlite
- マイグレーションを生成
$ php artisan make:migration create_people_table
- おそらく、
database/migrations/20XX_MM_DD_XXXXX_create_people_table.php
というものが出来上がっています。
その中のupメソッドを以下の様に修正。
public function up()
{
Schema::create('people', function (Blueprint $table) {
// ↓ここに必要なカラムや、型を記載してあげる。
$table->bigIncrements('id')->autoIncrement('id');
$table->TEXT('name');
$table->TEXT('mail')->nullable();
$table->INTEGER('age')->nullable();
$table->timestamps();
});
}
この様に、function内に
$table->指定したい型('カラム名');
のような形にしてあげます。
詳細は、ここ
- 記載できたら
php artisan migration
すると、テーブルが作成されます。(この時点でデータは空っぽ)
- シーダーの作成
ダミーデータを入れてくれるシーダーを用意します。
$ php artisan make:seeder PeopleTableSeeder
すると、/database/seeds/PeopleTableSeeder.php
というファイルが作成されます。
その中身を以下の様に記載
class PeopleTableSeeder extends Seeder
{
public function run()
{
// 2つ目の引数は作成したい件数。10と書けば、10件作成される。
$users = factory(App\Person::class, 3)->create();
}
}
このrun()メソッドの中に、手動でダミーデータを書くこともできますが、
面倒なので、ファクトリーというダミーデータを生成してくれる機能にお願いすることにします。
※現時点で、Personモデルが無ければ
$ php artisan make:model Person
で作成しておく。
- ファクトリー作成
$ php artisan make:factory PersonFactory
これで、/database/factories/PersonFactory.php
が作成されます。
このファイルの中身を以下のように記載
// ↓model名を変更
use App\Person;
use Faker\Generator as Faker;
// ↓model名を変更
$factory->define(Person::class, function (Faker $faker) {
return [
// ダミーデータを入れたい「 'カラム名' => $faker->ルール名 」 の形で記載
'name' => $faker->name,
'mail' => $faker->unique()->safeEmail,
'age' => $faker->randomNumber(2),
'created_at' => $faker->datetime($max = 'now', $timezone = date_default_timezone_get()),
'updated_at' => $faker->datetime($max = 'now', $timezone = date_default_timezone_get()),
];
});
$faker->ルール名
の形で利用できます。
上記例の場合は、
- nameカラムに、ダミーの名前データを入れたいので、
$faker->name
- ageには、2桁の数字を入れたいので、
$faker->randomNumber(2)
これらどの様なfakerの種類が有るかはこちらに詳しいです。
(まとめありがとうございます!)
-
/database/seeds/DatabaseSeeder.php
のrunメソッドの中身を以下のように修正
public function run()
{
$this->call(PeopleTableSeeder::class);
}
runの中の1行を変えて下さい。
今回は、PeopleTableSeeder
を使うので、上記の様に記載。
- 最後に、
$ php artisan db:seed
して、ダミーデータが作成されているかを確認したら終了です。