はじめに
30代公務員がエンジニア目指して勉強中。
備忘録として、Laravelを使用したダミーデータ作成についてまとめた。
シーディングファイルの作成
シードを作成するためのスクリプトファイルを生成する
php artisan make:seeder TodoTableSeeder
php artisan make:seeder CategoryTableSeeder
ファクトリの作成
ファクトリで作るデータの定義を作成する
php artisan make:factory TodoFactory
php artisan make:factory CategoryFactory
以上コマンドを実行で、database/factoriesディレクトリ以下にファイルが作成される。
それぞれ作成されたファイル内の definiton メソッドの中の[ ]内にデータの定義をしていく。
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
use App\Models\Category;
class CategoryFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
'name' => $this->faker->word(),
];
}
}
↑ name カラムに対して、ランダムな単語を作成してもらう。
<?php
namespace Database\Factories;
use App\Models\Category;
use Illuminate\Database\Eloquent\Factories\Factory;
use App\Models\Todo;
class TodoFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
'content'=>$this->faker->text(5),
'category_id'=> Category::inRandomOrder()->first()->id;
},
];
}
}
↑ content カラムには最大文字数(5)のテキストを生成。category_id カラムは外部キー制約があるためCategoryテーブルのid カラムを参照する。
なお、faker メソッドについて一部まとめた。
メソッド名 | 機能 |
---|---|
randomNumber() | 整数値をランダムに返す |
numberBetween(最小値,最大値) | 引数で指定した範囲内からランダムに整数を返す |
randomLetter() | ランダムな文字(アルファベット)を返す |
word() | ランダムな文字(英単語)を返す |
text(文字数) | 引数に指定した最大文字数のテキストを生成して返す |
sentence() | センテンス(一文)をランダムに生成して返す |
emoji | 絵文字をランダムに返す |
name() | 名前をランダムに返す |
country() | 国名をランダムに返す |
state() | ステート(州)をランダムに返す |
city() | 町の名前をランダムに返す |
date() | 日付(年月日)のテキストをランダムに返す |
safeEmail() | メールアドレスのテキストをランダムに返す |
password() | パスワードのテキストをランダムに返す |
ファクトリのシーダーへの設定
それぞれ作成した Seeder ファイル内のrun( ){ } 内に記述していく
<?php
namespace Database\Seeders;
use App\Models\Category;
use Illuminate\Database\Seeder;
use illuminate\Support\Facades\DB;
class CategoriesTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Category::factory()->count(10)->create();
}
}
↑ Category モデルを利用してEloquent からファクトリを呼び出している
count メソッドの引数でデータを生成する個数が決定される
<?php
namespace Database\Seeders;
use App\Models\Todo;
use Illuminate\Database\Seeder;
use Illuminate\Support\facades\DB;
class TodosTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Todo::factory()->count(20)->create();
}
}
↑ Todo モデルを利用してEloquent からファクトリを呼び出している
DatabaseSeederにシーダーを設定する
シーダーを DatabaseSeeder に登録する
<?php
namespace Database\Seeders;
use App\Models\Category;
use App\Models\Todo;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
$this->call(CategoryTableSeeder::class);
}
}
シーダーの登録ができたら、シーディングを利用する
php artisan migrate:fresh (必要であれば)
php artisan db:seed
まとめ
外部キー制約のあるカラムのダミーデータ作成について、知識が浅くしばらく悩んだ。
エラーは嫌だけど、エラー解消の瞬間が一番気持ちいいかもしれない。