【Laravel】データベースシーダにプログレスバーをつける

シーダ(初期値設定)クラスを使用し、テストデーターをデーターベースに設定するシンプルな方法もLaravelには備わっています。全シーダクラスはdatabase/seedsに保存します。シーダクラスには好きな名前を付けられます。しかしUsersTableSeederなどのような分かりやすい規則に従ったほうが良いでしょう。デフォルトとしてDatabaseSeederクラスが定義されています。このクラスからcallメソッドを使い他の初期値設定クラスを呼び出すことで、シーディングの順番をコントロールできます。
データベース:シーディング 6.x Laravel

 上記にある通り、シーダはLaravelに備わっているデータベースに値をまとめて投入するための仕組みです。大体 /database/seeder 以下にまとめて作られます。このシーダの処理中にプログレスバーを表示する方法を紹介します。実装は次で

<?php

use Illuminate\Database\Seeder;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Output\ConsoleOutput;

abstract class BaseSeeder extends Seeder
{
    /**
     * シーダーとして走るコード
     */
    abstract public function run(): void;

    /**
     * 色々情報の詰まったフォーマットに改造したプログレスバーを生成して返す。
     * @param  int         $max
     * @return ProgressBar
     */
    protected function createProgressBar($max = 0): ProgressBar
    {
        $progressBar = new ProgressBar(new ConsoleOutput(), $max);
        $progressBar->setFormat('%current%/%max% [%bar%] %percent%% %elapsed:6s%/%estimated:-6s% %memory:6s%');
        $progressBar->setEmptyBarCharacter(' ');
        $progressBar->setBarCharacter('=');
        $progressBar->setProgressCharacter('>');

        return $progressBar;
    }

    /**
     * 現在カーソルのある行をまっさらにする。
     */
    protected function clearLine(): void
    {
        echo "\033[2K\r";
    }
}

 次の様に使います。

<?php

use App\Models\Eloquents\User;

class UserSeeder extends BaseSeeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run(): void
    {
        $dataCount = 200;
        // プログレスバーを用意する
        $bar       = $this->createProgressBar($dataCount);
        factory(User::class, $dataCount)->make()->each(
            static function (User $user) use ($bar) {
                // Userに関するいろいろなデータの保存処理
                $user->save();
                // Userに関するいろいろなデータの保存処理
                $bar->advance();// プログレスバーを進める
            }
        );
        $bar->finish();// プログレスバーを終了
        $this->clearLine();// 行をきれいにしないと次の表示が壊れる
    }
}


 親クラス BaseSeeder にプログレスバーを用意する関数とプログレスバーをなかったことにする関数を用意し、子クラスの各シーダで呼びます。オートローディングの都合で trait は使うのが面倒なので親クラスに共通メソッドを置くパターン実装しています。プログレスバーを用意したら、通常の処理に加えてプログレスバーの開始、進行、終了を記述します。
 プログレスバーは以前紹介したコンソールのものをそのまま呼び出しています。
【Laravel】Artisanでプログレスバーを自在に作る – 株式会社シーポイントラボ | 浜松のシステム・RTK-GNSS開発
 この例ではプログレスバーのみですが次のリンク先にある Console Component も同様に使えます。
The Console Component (Symfony Docs)

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG