1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめての記事投稿
Qiita Engineer Festa20242024年7月17日まで開催中!

【Laravel】ダミーデータ作成【Models, factories, seeders】

Last updated at Posted at 2024-06-19

ダミーデータを生成する意味とは

データベースへ接続し、テーブルを作成したらテスト用データを作成したくなるかと思います。
ですが直接挿入するのはテストの一貫性が担保されません。
そこで簡単に一貫性のあるデータを流し込むことができる方法について紹介いたします。
※本記事は Laravel sail を使用し環境構築をしている想定です。

モデルの作成

物理名 論理名
id ID
name 名前
user_id ユーザー識別ID
url URL
remark 備考
created_at 作成日時
updated_at 更新日時

今回は例として上記のようなカラムを持つテーブル tests とやり取りするためのモデルファイルとファクトリーを作成します。

sail artisan make:model Test -f

こちらのコマンドにより app/Models フォルダ内に Test.php が生成されます。
このとき use HasFactory; 配下に必要に応じて以下のように $fillable を記載してください、

    protected $fillable = [
        'name',
        'status',
        'remark'
    ];

Laravel ではデフォルトでデータ大量挿入からデータベースを保護する仕組みがあります。
$fillable を記載し大量割り当てを許可するカラムを指定しましょう。

こちらの記事が具体的なイメージをつかむ参考になりました!
https://qiita.com/monji586/items/58d91891caa51b514166

ファクトリーの作成

ファクトリーとはモデルを利用したダミーデータやテストデータを作ることができる機能のことです。
先ほどモデルを作成した際のコマンドに -f オプションをつけているので database/factories フォルダ内に TestFactory.php が同時に作成されています。

まずはモデルとファクトリーを繋ぎ込むために下記のように protected $model を宣言しましょう。

    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    protected $model = Test::class;

その後 definition() 内にどのようにダミーデータを生成するか記載しましょう。
このとき fake ヘルパを使うと、ファクトリでさまざまな種類のランダムデータを生成できます。

    public function definition(): array
    {
        return [
            'name' => fake()->name(),
            'user_id' => 1,
            'url' => fake()->url(),
            'remark' => fake()->realText(30)
        ];
    }

fake ヘルパについてはこちらを参考にしました!
https://github.com/nshiro/faker-summary

実装後の TestFactory.php は全体としてこのようになります。

<?php

namespace Database\Factories;

use App\Models\Test;
use Illuminate\Database\Eloquent\Factories\Factory;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Test>
 */
class TestFactory extends Factory
{
    /**
     * このファクトリに対応するモデル名
     *
     * @var class-string<\Illuminate\Database\Eloquent\Model>
     */
    protected $model = Test::class;

    public function definition(): array
    {
        return [
            'name' => fake()->name(),
            'user_id' => $this->faker->randomNumber(100),
            'url' => fake()->url(),
            'remark' => fake()->realText(30)
        ];
    }
}

このコードでは以下のように生成を指示しています。
・名前
・100 までの乱数
・URL
・30 文字のテキスト

シーダーの作成とダミーデータ挿入

プログラミングにおけるシード(シーディング)とは、テストのためにデータベースにランダムなダミーデータを挿入することを意味します。

シーダーファイルの作成は下記のコマンドを実行します。

sail artisan make:seeder TestSeeder

成功後 database/seeders フォルダ内に TestSeeder.php ファイルが作成されます。

run 関数内に以下のコードを追加してください。

Test::factory(10)->create();

こちらのコードにより Test モデルに繋ぎ込み、TestFactory 内の definition 関数を実行し 10 件のダミーデータを作成するように指示しています。

このままでも実行できますがまとめて複数のテーブルのデータを生成できるように設定しましょう。
デフォルトで生成されている DatabaseSeeder 内の call メソッドを用いて以下のように記載しましょう。

/**
 * データベースに対するデータ設定の実行
 */
public function run(): void
{
    $this->call([
        TestSeeder::class,
    ]);
}

ここまで設定できたらシーダーを実行し、データを挿入してみましょう。
DatabaseSeeder に記載しているシーダーを全て実行する場合は

sail artisan db:seed

特定のシーダーを実行する場合は

sail artisan db:seed --class=TestSeeder

のようにコマンドを実行し、下記のように返ってくれば成功です!
お疲れ様でした!
スクリーンショット 2024-06-19 23.24.07.png

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?