Skip to content

[初期データ投入] Seederの投入方式を個別チェックに変更し、新規インストール時の問題を解決しました#2295

Merged
masaton0216 merged 5 commits intomasterfrom
fix-issue-2293-configs-seeder-idempotent
Oct 29, 2025
Merged

[初期データ投入] Seederの投入方式を個別チェックに変更し、新規インストール時の問題を解決しました#2295
masaton0216 merged 5 commits intomasterfrom
fix-issue-2293-configs-seeder-idempotent

Conversation

@masaton0216
Copy link
Contributor

@masaton0216 masaton0216 commented Oct 29, 2025

概要

背景

マイグレーションでConfigsテーブルにレコードを生成すると、新規インストール時にDefaultConfigsTableSeederの基本設定投入がスキップされ、システムが正常動作しない問題がありました(Issue #2293)。

原因はif (Configs::count() == 0)という条件により、Configsテーブルに1件でもレコードが存在すると16項目の基本設定が投入されない仕様でした。

目的

  • 新規インストール時にマイグレーションの影響を受けず、確実に基本設定を投入
  • 既存環境でも安全に実行できる冪等性の確保
  • Seeder内のコード統一(165行目以降と同じパターンに統一)

変更内容

1. database/seeders/DefaultConfigsTableSeeder.phpのリファクタリング:

  • if (Configs::count() == 0)による一括insert(16項目)を廃止
  • すべての設定項目を個別チェック(where('name', '項目名')->count() == 0)に変更
  • 未使用変数$configsを削除し、コードスタイルを統一

2. パフォーマンス最適化

  • クエリ回数の削減: 28回 → 1回 + insert
  • 既存設定を一括取得(Configs::pluck('name')->toArray())
  • メモリ内で存在チェック(in_array())による高速化

3. コード品質向上

  • 設定データをgetDefaultConfigs()メソッドに集約
  • カテゴリごとに整理(general, user_register, auth, app_log, wysiwyg, server)
  • 変数名をスネークケースに統一($existing_config_names等)
  • additional1フィールドの用途をコメントで明記

4. 包括的なテストの追加

tests/Unit/Database/Seeders/DefaultConfigsTableSeederTest.phpを新規作成:

  • 新規インストールケースのテスト
  • 冪等性の確認(複数回実行しても重複しない)
  • 一部設定が存在する場合のテスト
  • マイグレーション実行後のテスト(Issue #2293の回帰テスト)
  • カテゴリ別設定数の確認
  • NULL値・Enum値・additional1フィールドの検証

テスト結果: 全8テストケースがパス ✅

技術的な改善ポイント

Before (最初の改善版)

  // 各設定項目を個別にチェック(28回のクエリ)
  if (Configs::where('name', 'base_background_color')->count() == 0) {
      Configs::create([...]);
  }
  // ... 27回繰り返し

After (最適化版)

  // 既存設定を一括取得(1回のクエリ)
  $existing_config_names = Configs::pluck('name')->toArray();

  foreach ($this->getDefaultConfigs() as $category => $configs) {
      foreach ($configs as $name => $data) {
          if (!in_array($name, $existing_config_names)) {
              Configs::create([...]);
          }
      }
  }

効果

  • ✅ 新規インストール時の問題を根本解決
  • ✅ パフォーマンス向上(クエリ数: 28回 → 1回)
  • ✅ コードの保守性向上(286行 → 107行、64%のコード削減)
  • ✅ テストによる品質保証(8つのテストケース)
  • ✅ 将来の設定追加が容易(配列に追加するだけ)

これにより、マイグレーションでConfigsレコードが先に作成されても、各設定項目は個別に存在チェックされ、不足している項目だけが投入されます。

レビュー完了希望日

不具合対応なので急ぎたいです

関連Pull requests/Issues

参考

  • 同様の問題の過去対応: 2021_01_16_094533_additional_configs_move_from_migration_to_seeder.php

DB変更の有無

無し

チェックリスト

@masaton0216 masaton0216 changed the title [システム] 初期設定Seederの投入方式を個別チェックに変更し、新規インストール時の問題を解決しました [データ投入] 初期設定Seederの投入方式を個別チェックに変更し、新規インストール時の問題を解決しました Oct 29, 2025
@masaton0216 masaton0216 self-assigned this Oct 29, 2025
@masaton0216 masaton0216 added the bug バグ・不具合連絡 label Oct 29, 2025
@masaton0216 masaton0216 changed the title [データ投入] 初期設定Seederの投入方式を個別チェックに変更し、新規インストール時の問題を解決しました [初期データ投入] Seederの投入方式を個別チェックに変更し、新規インストール時の問題を解決しました Oct 29, 2025
@masaton0216 masaton0216 merged commit 2a1bf59 into master Oct 29, 2025
1 check passed
@masaton0216 masaton0216 deleted the fix-issue-2293-configs-seeder-idempotent branch October 29, 2025 06:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug バグ・不具合連絡

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant