1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

LaravelでFactoryとSeederを使ってデータを登録する

Posted at

はじめに

今回はLaravelでFactoryを使ってSeederでDBに大量にデータを登録していく。
テストだったりである程度データが必要な場合などに非常に便利な機能。

実際の使い方

Factoryを作成

Laravelのartisanコマンドを使って、Factoryを作っていきます。
今回はTrRecordFactoryを作っていきます。

CA8775:toreka_project 01048656$ php artisan make:factory TrRecordFactory

Factoryファイルを編集

コマンドを打つと今回の場合database\factories\TrRecordFactory.phpファイルが作成されるのでそれを編集していきます。

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に一文追加しましょう。

TrRecord.php
class TrRecord extends Model
{
    use HasFactory;
}

Factoryのdefinitionメソッドを修正する

配列形式でカラムに対応する値を書いていきます。

TrRecordFactory.php
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モデルにそれぞれデータを登録するため、下記のような感じで書く。

TrRecordSeeder.php
<?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に記載します。

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を打つときはコンテナ内でやりましょう。
そうしないとエラーが起きて登録ができません。
僕自身何度も引っかかっているので要注意です。。

以上

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?