Laravel Factoryで単純に連番を振ったり〇〇単位で連番を振る方法

Laravel Factoryで単純に連番を振ったり〇〇単位で連番を振る方法

LaravelのFactoryは、様々なfakerで名前や市区町村のダミーデータが生成できますが、連番は用意されていません。

ただただ連番を振っていく

staticで連番用の変数を持ち、その値を加算しつつ振ることで順次連番を振ることが出来ます。

class SampleModelFactory extends Factory
{
    protected $model = SampleModel::class;

    private static int $sequence = 1;

    public function definition()
    {
        return [
            'item_number' => function () { return self::$sequence++; },
        ];
    }
}

○○ごとに連番を振っていく

PostとCommentなどの一対多の関係性のテーブルに対して、PostごとにComment番号を振る場合はもうひと工夫必要です。
staticの連番用の変数 ($commentNumber) を持つところまでは同じです。
次にPostIdごとに連番を初期化するために最後に振ったPostIdを記憶しておくためのstatic変数を用意します。

ポイントは、configureメソッド内でfactory生成後に実行する処理として、最後に振ったPostIdと今回振られたPostIdが変わっていれば、commentNumberをリセットする点です。

class SampleModelFactory extends Factory
{
    protected $model = SampleModel::class;

    private static int $postId = 0;
    private static int $commentNumber = 1;

    public function definition()
    {
        return [
            'post_id' => fn () => PostModel::factory()->create()->id,
            'comment_number' => self::$commentNumber++,
        ];
    }

    public function configure()
    {
        return $this->afterMaking(function (SampleModel $sampleModel) {
            //
        })->afterCreating(function (SampleModel $sampleModel) {
            if (self::$postId !== $sampleModel->post_id) {
                self::$postId = $sampleModel->post_id;
                self::$commentNumber = 1;
            }
        });
    }
}

 

プログラミングカテゴリの最新記事