Laravel8でテストデータを入れたい時の、Factoryの使い方メモです。
環境:XAMPP for Windows, Laravel Framework 8.6.0
☞ 今回のケース ☜
・ 例えば、Twitterのクローンアプリを作っていて、ツイートを管理するテーブルにテストデータを入れたい時。
マイグレーションファイルはこのような感じ。↓↓ データを入れたいのは、'user_id'と、'body'の二つだけ。
public function up()
{
Schema::create('tweets', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id');
$table->string('body');
$table->timestamps();
});
}
手順1.ターミナルで以下コマンドを打って、TweetFactory.php を作る。
・database\factories\TweetFactory.php にファイルができます!
php artisan make:factory TweetFactory --model=Tweet
手順2.Laravel8になってから、globalなfactory()関数は削除されました。その為、モデルのFactoryクラスを使います。
該当するモデルファイルに、『Illuminate\Database\Eloquent\Factories\HasFactory』がインポートされているかを確認すること。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory; // ←ここ確認。
use Illuminate\Database\Eloquent\Model;
class Tweet extends Model
{
use HasFactory;
}
手順3:作成したTweetFactory.phpを編集する。
・連携するモデルがインポートされているかを確認して、return[]部分を追記します。
<?php
namespace Database\Factories;
use App\Models\Tweet; //←モデルがインポートされているかを確認!
use App\Models\User; //←モデルがインポートされているかを確認!
use Illuminate\Database\Eloquent\Factories\Factory;
class TweetFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = Tweet::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
'user_id' => User::factory(), //←ここ追記
'body' => $this->faker->sentence //←ここ追記
];
}
}
手順4. DatabaseSeeder.phpに追記する。
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
// \App\Models\User::factory(10)->create();
\App\Models\Tweet::factory(10)->create(); //←ここ追記
}
}
手順5.seedを実行する。
ターミナルで以下コマンドを実行します。
php artisan db:seed
以上で該当のテーブルにテストデータが入ります。
usersテーブルにもデータが入り。。
テストデータを日本語にしたい場合は、config/app.phpの'faker_locale'を以下のように修正します。
'faker_locale' => 'ja_JP',
以上です。
*因みに、上記の手順はteamsオプションを追加していない場合です。teamsオプションを有効にしてJetstreamをインストールしている場合は、以下の参考サイトさんで分かりやすく説明頂いていたので、ご参考に!