🐥
【Laravel8】Factoryを使ってテストデータを登録する
はじめに
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テーブル
authorsテーブル
Discussion