はじめに
私は、HTML、CSS、JavaScript(React,Next)を少しだけかじったことがある程度から、今回初めてフルスタックフレームワークのLaravelを学びました。
MVCモデルにそった開発は、頭の中がすっきりとわかりやすく、すごいなぁと感じることができていました。その中で、ダミーデータを生成してくれる?ダミーデータ?シーダー?ファクトリー?そんな便利なものまであるの?というなぞに包まれた便利機能。
まったくそのようなものが世の中にあるとも想像してないかったため、利用する上で少し困惑が多かったので備忘録として利用の流れをまとめておこうと思いました。
もっと効率的なダミーデータ生成もあるのかと思いますが、初学者の思い出話と見届けて頂けたらと思います。
単一データの挿入(seeder利用)
- seederクラスの作成
php artisan make:seeder 作成したいシーダー名Seeder
2.作成されたseederクラスに、クエリビルダーを使用するためのDBモデルとパスワードをデータ挿入する場合は、ハッシュ化が必要なためHasuモデルをuseする必要がある
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
3.Seederモデルのrun関数に挿入したいダミーデータを記述する
class User extends Seeder{
@return void;
public function run(): void
{
DB::table('挿入したいテーブル名')->insert([
[
'name' => 'ysk',
'email' => 'ysk@example.com',
'password' => Hash::make('password'),
]
]);
}
4.DatabaseSeeder.phpで追加したいseederファイルを呼び出す必要がある
public function run(): void
{
$this->call([
UserSeeder::class,
]);
}
5.マイグレーションの実行
このコマンドを実行すると、過去に作成されたテーブルを削除してテーブル再作成と同時にダミーデータを挿入する
php artisan migrate:fresh -seed
複数データの挿入(factory利用)
-
複数(多数の)データを挿入
Eloquent:ファクトリ 10.x Laravel-
Factoryクラスを作成する
php artisan make:factory 作成したいファクトリ名Factory
-
ダミーデータの日本語設定
config/app.phpファイルを変更する'faker_locale' => 'ja_JP',
-
ダミーデータ作成メソッドを利用して、カラムに対して適切なメソッドをfactoryファイルに設定する
faker作成メソッド一覧
[2022年最新版] Laravel の開発に欠かせない Faker のチートシートを作ってみた//Userモデルのダミーデータの定義をする public function definition(): array { return [ 'name' => fake()->name(), 'email' => fake()->unique()->safeEmail(), 'email_verified_at' => now(), 'password' => static::$password ??= Hash::make('password'), 'remember_token' => Str::random(10), ]; }
-
外部キー制約があるカラムに対するデータの挿入(1user、1post)
//PostFactpry.php //Postモデルのダミーデータの定義をする public function definition(): array { return [ 'title'=>fake()->realText(20), 'content'=>fake()->realText(300), 'user_id'=>User::factory()->create()->id, ]; } //seederファイル use App\Models\Post; public function run(): void { Post::factory->create(); //1データ作成 Post::factory->count(作成したい数)->create(); //複数データ作成 }
-
外部キー制約があるカラムに対するデータの挿入(1user、3post)(hasMany側の場合)
//UserモデルがPostモデルに対して、1対多(hasMany)を定義していると仮定 //Postモデルのダミーデータの定義をする public function definition(): array { return [ 'title'=>fake()->realText(20), 'content'=>fake()->realText(300), ]; } //seederファイル use App\Models\User; use App\Models\Post; public function run(): void { //1userが3postのダミーデータ1データ作成 $user = User::factory() ->has(Post::factory()->count(3)) ->create(); //1userが3postのダミーデータ複数データ作成 $user = User::factory()->count(作成したい数) ->has(Post::factory()->count(3)) ->create(); }
-
外部キー制約があるカラムに対するデータの挿入(1user、3post)(belongTo側の場合)
//PostモデルがUserモデルに対して、1対多(belongTo)を定義していると仮定 //seederファイル use App\Models\User; use App\Models\Post; public function run(): void { for ($i = 0; $i < 30; $i++) { Post::factory() ->count(3) ->for(User::factory()) ->create(); } }
-
中間テーブルへダミーデータを紐付けしながらデータ挿入
PostモデルデータとTagモデルデータが多対多であると仮定
//中間テーブルファクトリーファイル public function definition(): array { //PostとTagモデルダミーデータを事前に挿入してある状況から $post_id=Post::all()->random(1)[0]->id; $tag_id=Tag::all()->random(1)[0]->id; return [ 'post_id'=>$post_id, 'tag_id'=>$tag_id, ]; }
-
-
artisanコマンドで実行
php artisan migrate:fresh --seed
-
まとめ
ダミーデータ生成してテーブルにデータを挿入できてはいるけども、もっと違うやり方があるのでは?と思いながらの内容です。しかし一旦は自分自身で扱いたいダミーデータを作成することができたのでよしとしています。
かなり読みづらい構成になっておりますが、申し訳ありません...