いろいろ技術的メモ

仕事に差し障りない範囲で、関連ネタなど…

Seeder

これ割と重要な機能。テストデータや初期データも作れるし。

laravel.com

5.4のSeedingの基本的な使い方。

 

 

基本:

  1. php artisan make:seeder TasksTableSeeder
  2. database\seeds\DatabaseSeeder.phpに、生成されたseederを追加してやる。生成されるseederも同じ場所にある。
  3. 作成したTasksTableSeederに、生成挙動を追加する。一括生成するなら、database\factories\ModelFactory.php にルールを書き込む。
  4. artisan経由で実行。データ生成させる。この場合の実行方法は複数パターンある。

 

1:

seederを、ファイル名指定で作成出来る。名称の命名規則的には、テーブル名にTableSeederを付与すれば良いだろう。

database\seeds\ 以下に作成される。

DatabaseSeeder.phpには、自動で追加されたりはしない。

また、この処理では、テンプレートが作成されるだけで、app内のモデルなどは、ちゃんとuse指定の追加等が必要。

use App\Task;
use Illuminate\Database\Eloquent\Model;

など。

 

 

 

3:

生成挙動の実装にも複数パターンが考えられる。

$faker = \Faker\Factory::create();
for ( $i=0; $i<50; $i++ ) {
	$task = new Task();
	$task->name = $faker->name;
	$task->save();
}

fakerを作成し、ループ内で Modelクラスをnewで生成して、直接saveをたたき、データを構築する。項目数が多いと面倒だが、ある程度のパターンから外れるケースにも対応出来そう。

factory(Task::class, 50)->create();

 database\factories\ModelFactory.phpに、あらかじめ自動処理のひな形設定が必要。

それが済んでいるなら、記述的にはとてもシンプル。単純にデータ件数を増やしたい場合も扱いやすいかも。 

DB::table('tasks')->insert([
	'name' => str_random(12),
]);

 DBファサード経由でtable指定で、直接insert処理を実行する。

結果的に、やっていることは変わらないが、この方法をとる場合、DBとの結合が強くなる点は問題か。疎結合を目指すなら、この方法は良くないだろう。

 

 

4:

seedsの実行パターンは複数ある。

php artisan db:seed --class="TasksTableSeeder"

最初の実行方法は、作成したseeder単体で指定してキックする。今作ったテーブルだけ生成するなら、これでいい。このパターンなら、DatabaseSeeder.phpに追記しなくても実行可能。

php artisan db:seed

二つ目は、DatabaseSeeder.phpに登録済みのseederを一括実行するパターン。実行のたびに、登録済みの全seederがごりごり稼働するので、複数登録処理の場合は、データ量をどんどん増やせる。ある程度のデータ件数がほしいなら、この流れがいいかも。

php artisan migrate:refresh --seed

三つ目は、migrationをちゃんと作成している場合に使える。テーブル内のデータを一回全削除してリセットし、seed作成を連続して実行する。seeder全体の整合性など、データ状態の再設定にもよい。

 

これらパターンを考慮するとき、migrationも、seederも、フレームワークとartisanで作成しておく方が、利便性や安定性は増すと思われる。