はじめに
今回はLaravelでFactoryを使ってSeederでDBに大量にデータを登録していく。
テストだったりである程度データが必要な場合などに非常に便利な機能。
実際の使い方
Factoryを作成
Laravelのartisanコマンドを使って、Factoryを作っていきます。
今回はTrRecordFactory
を作っていきます。
CA8775:toreka_project 01048656$ php artisan make:factory TrRecordFactory
Factoryファイルを編集
コマンドを打つと今回の場合database\factories\TrRecordFactory.php
ファイルが作成されるのでそれを編集していきます。
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
// 追記
use App\Models\User;
use App\Models\TrRecord;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\TrRecord>
*/
class TrRecordFactory extends Factory
{
/**
* 追加
* モデルに対応したファクトリの名前
*
* @var string
*/
protected $model = TrRecord::class;
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition()
{
return [
// 追加
'user_id' => User::factory(),
'part' => '胸',
'menu' => 'ベンチプレス',
'set_type' => 'ノーマルセット',
'weight_first' => 100,
'reps_first' => 10,
];
}
}
大きく3箇所いじっていきます。
1つ目はuse文を使ってmodelを使えるようにしましょう。
use App\Models\User;
use App\Models\TrRecord;
2つ目はモデルに対応したファクトリの名前を記述してあげます。
protected $model = TrRecord::class;
3つ目はreturn文の中に今回入れるデータの中身を書いていきます。
return [
// 追加
'user_id' => User::factory(),
'part' => '胸',
'menu' => 'ベンチプレス',
'set_type' => 'ノーマルセット',
'weight_first' => 100,
'reps_first' => 10,
];
これでFactoryファイルはOKです。
Modelを編集
HasFactoryトレイトを使うようにしておく必要があるため、Modelに一文追加しましょう。
class TrRecord extends Model
{
use HasFactory;
}
Factoryのdefinitionメソッドを修正する
配列形式でカラムに対応する値を書いていきます。
public function definition()
{
return [
// 追加
'user_id' => User::factory(),
'part' => '胸',
'menu' => 'ベンチプレス',
'set_type' => 'ノーマルセット',
'weight_first' => 100,
'reps_first' => 10,
];
}
TrRecordSeederを作成する
下記コマンドを打ち込みSeederファイルを作成する。
CA8775:toreka_project 01048656$ php artisan make:seeder TrRecordSeeder
このような感じのファイルが作成されるので、対応するモデルを使えるようにuse文
を記載。
またrunメソッド
内に下記のような感じで記載をする。
今回はUserモデルとTrRecordモデルにそれぞれデータを登録するため、下記のような感じで書く。
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\User;
use App\Models\TrRecord;
class TrRecordSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
User::factory()->has(TrRecord::factory(10))->create();
}
}
SeederでFactoryを使用する
作成したFactoryを使用するように、database/seeders/DatabaseSeeder.php
に記載します。
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
$this->call(TrRecordSeeder::Class);
}
}
Seederを実行する
root@4cd878229358:/work/backend# php artisan db:seed
Seeding: Database\Seeders\TrRecordSeeder
Seeded: Database\Seeders\TrRecordSeeder (5,418.16ms)
これでデータを登録することができました。
基礎的な注意点として、上記コマンドphp artisan db:seed
を打つときはコンテナ内でやりましょう。
そうしないとエラーが起きて登録ができません。
僕自身何度も引っかかっているので要注意です。。
以上