🐥

【Laravel8】Factoryを使ってテストデータを登録する

2021/05/22に公開

はじめに

Laravel8でテーブル作成からテストデータを入れるまでの手順をまとめてみました。
テストデータの作成にはFactoryを使っていますが、Laravel8から書き方が変更になっています。(公式ドキュメント
今回はBooksとAuthorsの2つのテーブルを新規作成しテストデータを入れてみました。

手順

Table作成

artisanコマンドを使ってテーブルを作成します。

$ php artisan make:migration create_books_table --create=books
$ php artisan make:migration create_authors_table --create=authors

コマンドを実行するとdatabase/migrations配下にテーブル作成のためのファイルができるため、upメソッド内にテーブルの情報を追加します。

database/migrations/2021_05_21_043405_create_books_table.php
public function up()
{
    Schema::create('books', function (Blueprint $table) {
        $table->id();
        $table->string('title')->comment('題名');
        $table->integer('author_id')->comment('著者ID');
        $table->timestamps();
    });
}
database/migrations/2021_05_21_043518_create_authors_table.php
public function up()
{
    Schema::create('authors', function (Blueprint $table) {
        $table->id();
        $table->string('name')->comment('氏名');
        $table->timestamps();
    });
}

Model作成

artisanコマンドを使ってモデルを作成します。

$ php artisan make:model Book
$ php artisan make:model Author

今回、モデルの中身は変更せずそのまま使用します。
モデル内ではデフォルトで Illuminate\Database\Eloquent\Factories\HasFactoryがインポートされトレイトがクラスに追加されています。

app/Models/Book.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    use HasFactory;
}

Factory作成

artisanコマンドを使ってファクトリーを作成します。

$ php artisan make:factory BookFactory
$ php artisan make:factory AuthorFactory

booksテーブルのauthor_idは外部キーのため、Authorモデルをインポートしfactoryメソッドを実行します。

database/factories/BookFactory.php
<?php

namespace Database\Factories;

use App\Models\Author;
use App\Models\Book;
use Illuminate\Database\Eloquent\Factories\Factory;

class BookFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = Book::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'author_id' => Author::factory(), // 追加
            'title' => $this->faker->sentence(), // 追加
        ];
    }
}
database/factories/AuthorFactory.php
<?php

namespace Database\Factories;

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

class AuthorFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = Author::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'name' => $this->faker->name(), // 追加
        ];
    }
}

実行

作成したseederをDatabaseSeeder.phpに登録します。
今回はBookFactory.php内でAuthorのfactoryメソッドを呼び出しているため、AuthorFactory.phpの記述は不要です。

database/seeders/BatabaseSeeder.php
public function run()
{
    \App\Models\Book::factory(100)->create();
}

日本語化も合わせてしておきます。

config/app.php
'faker_locale' => 'ja_JP',

artisanコマンドを実行しテストデータを各テーブルに入れていきます。

$ php artisan db:seed

成功すると下記のようにテストデータが登録されます。
booksテーブル
booksテーブル
authorsテーブル
authorsテーブル

Discussion