1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravelでダミーデータ作成

Last updated at Posted at 2023-08-25

はじめに

30代公務員がエンジニア目指して勉強中。
備忘録として、Laravelを使用したダミーデータ作成についてまとめた。

シーディングファイルの作成

シードを作成するためのスクリプトファイルを生成する

PHPコンテナ内
php artisan make:seeder TodoTableSeeder
php artisan make:seeder CategoryTableSeeder

ファクトリの作成

ファクトリで作るデータの定義を作成する

PHPコンテナ内
php artisan make:factory TodoFactory
php artisan make:factory CategoryFactory

以上コマンドを実行で、database/factoriesディレクトリ以下にファイルが作成される。

それぞれ作成されたファイル内の definiton メソッドの中の[ ]内にデータの定義をしていく。

CategoryFactory.php
<?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 カラムに対して、ランダムな単語を作成してもらう。

TodoFactory.php
<?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( ){ } 内に記述していく

CategoriesTableSeeder.php
<?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 メソッドの引数でデータを生成する個数が決定される

TodosTableSeeder.php
<?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 に登録する

DatabaseSeeder.php
<?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コンテナ内
php artisan migrate:fresh (必要であれば)
php artisan db:seed

まとめ

外部キー制約のあるカラムのダミーデータ作成について、知識が浅くしばらく悩んだ。
エラーは嫌だけど、エラー解消の瞬間が一番気持ちいいかもしれない。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?