シーダ(初期値設定)クラスを使用し、テストデーターをデーターベースに設定するシンプルな方法も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)