LoginSignup
0
0

Laravel 10.x ダミーデータ作成(Factory使用)

Posted at

はじめに

私は、HTML、CSS、JavaScript(React,Next)を少しだけかじったことがある程度から、今回初めてフルスタックフレームワークのLaravelを学びました。
MVCモデルにそった開発は、頭の中がすっきりとわかりやすく、すごいなぁと感じることができていました。その中で、ダミーデータを生成してくれる?ダミーデータ?シーダー?ファクトリー?そんな便利なものまであるの?というなぞに包まれた便利機能。
まったくそのようなものが世の中にあるとも想像してないかったため、利用する上で少し困惑が多かったので備忘録として利用の流れをまとめておこうと思いました。
もっと効率的なダミーデータ生成もあるのかと思いますが、初学者の思い出話と見届けて頂けたらと思います。

単一データの挿入(seeder利用)

  1. 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

    1. Factoryクラスを作成する

      php artisan make:factory 作成したいファクトリ名Factory
      
    2. ダミーデータの日本語設定
      config/app.phpファイルを変更する

      'faker_locale' => 'ja_JP',
      
    3. ダミーデータ作成メソッドを利用して、カラムに対して適切なメソッドを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,
            ];
          }
        
    4. artisanコマンドで実行

      php artisan migrate:fresh --seed
      

まとめ

ダミーデータ生成してテーブルにデータを挿入できてはいるけども、もっと違うやり方があるのでは?と思いながらの内容です。しかし一旦は自分自身で扱いたいダミーデータを作成することができたのでよしとしています。
かなり読みづらい構成になっておりますが、申し訳ありません...

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0