app/DoctrineMigrations/Version20251119162204.php line 1

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace DoctrineMigrations;
  4. use Doctrine\DBAL\Schema\Schema;
  5. use Doctrine\Migrations\AbstractMigration;
  6. /**
  7.  * dtb_maintenance_schoolテーブルのインデックスと外部キーを再作成
  8.  */
  9. final class Version20251119162204 extends AbstractMigration
  10. {
  11.     public function getDescription(): string
  12.     {
  13.         return 'dtb_maintenance_schoolテーブルのインデックスと外部キー制約を正しい順序で再作成';
  14.     }
  15.     public function up(Schema $schema): void
  16.     {
  17.         // MySQLの場合のみ実行
  18.         if ($this->connection->getDatabasePlatform()->getName() !== 'mysql') {
  19.             return;
  20.         }
  21.         // 既存の外部キー制約を確認して削除
  22.         $foreignKeys $this->connection->fetchAllAssociative("
  23.             SELECT CONSTRAINT_NAME 
  24.             FROM information_schema.TABLE_CONSTRAINTS 
  25.             WHERE TABLE_SCHEMA = DATABASE() 
  26.             AND TABLE_NAME = 'dtb_maintenance_school' 
  27.             AND CONSTRAINT_TYPE = 'FOREIGN KEY'
  28.         ");
  29.         
  30.         foreach ($foreignKeys as $fk) {
  31.             $this->addSql("ALTER TABLE dtb_maintenance_school DROP FOREIGN KEY " $fk['CONSTRAINT_NAME']);
  32.         }
  33.         
  34.         // 古いインデックスを削除
  35.         $indexes $this->connection->fetchAllAssociative("
  36.             SELECT DISTINCT INDEX_NAME 
  37.             FROM information_schema.STATISTICS 
  38.             WHERE TABLE_SCHEMA = DATABASE() 
  39.             AND TABLE_NAME = 'dtb_maintenance_school' 
  40.             AND INDEX_NAME IN ('idx_maintenance_settings', 'idx_school', 'IDX_C00A091853B3712F', 'IDX_C00A0918C32A47EE')
  41.         ");
  42.         
  43.         foreach ($indexes as $index) {
  44.             $this->addSql("DROP INDEX " $index['INDEX_NAME'] . " ON dtb_maintenance_school");
  45.         }
  46.         
  47.         // 無効な参照データをクリーンアップ(maintenance_settings_idが存在しないレコードを削除)
  48.         $this->addSql("
  49.             DELETE FROM dtb_maintenance_school 
  50.             WHERE maintenance_settings_id IS NOT NULL 
  51.             AND maintenance_settings_id NOT IN (SELECT id FROM dtb_maintenance_settings)
  52.         ");
  53.         
  54.         // 無効な参照データをクリーンアップ(school_idが存在しないレコードを削除)
  55.         $this->addSql("
  56.             DELETE FROM dtb_maintenance_school 
  57.             WHERE school_id IS NOT NULL 
  58.             AND school_id NOT IN (SELECT school_id FROM dtb_school)
  59.         ");
  60.         
  61.         // 新しいインデックスを作成(存在しない場合のみ)
  62.         $existingIndexes $this->connection->fetchAllAssociative("
  63.             SELECT DISTINCT INDEX_NAME 
  64.             FROM information_schema.STATISTICS 
  65.             WHERE TABLE_SCHEMA = DATABASE() 
  66.             AND TABLE_NAME = 'dtb_maintenance_school' 
  67.             AND INDEX_NAME = 'IDX_C00A091853B3712F'
  68.         ");
  69.         
  70.         if (empty($existingIndexes)) {
  71.             $this->addSql("CREATE INDEX IDX_C00A091853B3712F ON dtb_maintenance_school (maintenance_settings_id)");
  72.         }
  73.         
  74.         $existingIndexes2 $this->connection->fetchAllAssociative("
  75.             SELECT DISTINCT INDEX_NAME 
  76.             FROM information_schema.STATISTICS 
  77.             WHERE TABLE_SCHEMA = DATABASE() 
  78.             AND TABLE_NAME = 'dtb_maintenance_school' 
  79.             AND INDEX_NAME = 'IDX_C00A0918C32A47EE'
  80.         ");
  81.         
  82.         if (empty($existingIndexes2)) {
  83.             $this->addSql("CREATE INDEX IDX_C00A0918C32A47EE ON dtb_maintenance_school (school_id)");
  84.         }
  85.         
  86.         // 外部キー制約を再作成
  87.         $this->addSql("
  88.             ALTER TABLE dtb_maintenance_school 
  89.             ADD CONSTRAINT FK_C00A091853B3712F 
  90.             FOREIGN KEY (maintenance_settings_id) REFERENCES dtb_maintenance_settings (id)
  91.         ");
  92.         
  93.         $this->addSql("
  94.             ALTER TABLE dtb_maintenance_school 
  95.             ADD CONSTRAINT FK_C00A0918C32A47EE 
  96.             FOREIGN KEY (school_id) REFERENCES dtb_school (school_id)
  97.         ");
  98.     }
  99.     public function down(Schema $schema): void
  100.     {
  101.         // 必要に応じてロールバック処理を記述
  102.     }
  103. }