CakePHP 4 で開発用の大量データをシードで作る

はじめに

Web システム開発では、ページナビなどの動作確認に大量のデータが必要になる場合があります。

しかしそれらを手動で登録するのは辛いですよね...

そこで今日は CakePHP 4 のシード機能を使って、開発用の大量データを短時間で簡単に準備する方法をご紹介します。

またチーム開発で Git を使うケース等のために、作ったシードを Git の管理対象外にする方法も併せてご紹介します。

今回は CakePHP 4.5 で確認していますが、4.x 系ならどれでも同様の手順で行けるかと思います。

目次
  1. 大量データのシード作成&実行
  2. Git の対象外にする

1. 大量データのシード作成&実行

今回は下記のような drinks テーブルを例にしています。

CREATE TABLE drinks (
  id int(11) NOT NULL,
  name varchar(255) NOT NULL,
  created datetime NOT NULL,
  modified datetime NOT NULL
);

シードの内容を下記のようにすることで大量のデータを簡単に作ることができます。

本番用シードと区別するため、今回は SeedsDev フォルダに置いています。
フォルダ名は変えていただいて差支えありません。
(もしすでに SeedsDev がある場合は別フォルダを作ることをお勧めします)

config/SeedsDev/DrinksSeed.php
<?php
declare(strict_types=1);

use Cake\I18n\FrozenDate;
use Migrations\AbstractSeed;

/**
 * Drinks seed.
 */
class DrinksSeed extends AbstractSeed
{
    /**
     * Run Method.
     *
     * @return void
     */
    public function run(): void
    {
        // 件数
        $qty = 1000;

        // 基準日時(時間は 00:00:00)
        $baseTimestamp = FrozenDate::now()->subDays($qty);

        $data = [];
        foreach (range(1, $qty) as $i) {
            $created = $baseTimestamp->addDays($i);
            $modified = $created;

            $data[] = [
                'id' => $i,
                'name' => "飲料 {$i}",
                'created' => $created,
                'modified' => $modified,
            ];
        }

        $table = $this->table('drinks');
        $table->truncate();
        $table->insert($data)->save();
    }
}

$baseTimestamp は created に使用していますが、created の日付はレコード1件挿入ごとに + 1日していくため、未来の created ができないように subDays($qty) で調整しています。

今回は modified を created と同じにしていますが、可変にしてもいいかもしれませんね。

このシードの実行は下記コマンドで行えます。

bin/cake migrations seed --source SeedsDev --seed DrinksSeed

2. Git の対象外にする

下記のように「*」と記述した .gitignore を SeedsDev フォルダに置けば、SeedsDev フォルダ自体共有されません。

config/SeedsDev/.gitignore
*