app/DoctrineMigrations/Version20251119163203.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_school_brother_displayテーブルのインデックスと外部キーを再作成
  8.  */
  9. final class Version20251119163203 extends AbstractMigration
  10. {
  11.     public function getDescription(): string
  12.     {
  13.         return 'dtb_school_brother_displayテーブルのインデックスと外部キー制約を正しい順序で再作成';
  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_school_brother_display' 
  27.             AND CONSTRAINT_TYPE = 'FOREIGN KEY'
  28.         ");
  29.         
  30.         foreach ($foreignKeys as $fk) {
  31.             $this->addSql("ALTER TABLE dtb_school_brother_display 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_school_brother_display' 
  40.             AND INDEX_NAME IN ('idx_school_brother_display_base_school', 'idx_school_brother_display_target_school')
  41.         ");
  42.         
  43.         foreach ($indexes as $index) {
  44.             $this->addSql("DROP INDEX " $index['INDEX_NAME'] . " ON dtb_school_brother_display");
  45.         }
  46.         
  47.         // 新しいインデックスが既に存在する場合は削除
  48.         $existingIndexes $this->connection->fetchAllAssociative("
  49.             SELECT DISTINCT INDEX_NAME 
  50.             FROM information_schema.STATISTICS 
  51.             WHERE TABLE_SCHEMA = DATABASE() 
  52.             AND TABLE_NAME = 'dtb_school_brother_display' 
  53.             AND INDEX_NAME IN ('IDX_54988867006D663', 'IDX_5498886F79E35C2')
  54.         ");
  55.         
  56.         foreach ($existingIndexes as $index) {
  57.             $this->addSql("DROP INDEX " $index['INDEX_NAME'] . " ON dtb_school_brother_display");
  58.         }
  59.         
  60.         // 新しいインデックスを作成
  61.         $this->addSql("CREATE INDEX IDX_54988867006D663 ON dtb_school_brother_display (base_school_id)");
  62.         $this->addSql("CREATE INDEX IDX_5498886F79E35C2 ON dtb_school_brother_display (target_school_id)");
  63.         
  64.         // 外部キー制約を作成
  65.         $this->addSql("
  66.             ALTER TABLE dtb_school_brother_display 
  67.             ADD CONSTRAINT FK_54988867006D663 
  68.             FOREIGN KEY (base_school_id) REFERENCES dtb_school (school_id)
  69.         ");
  70.         
  71.         $this->addSql("
  72.             ALTER TABLE dtb_school_brother_display 
  73.             ADD CONSTRAINT FK_5498886F79E35C2 
  74.             FOREIGN KEY (target_school_id) REFERENCES dtb_school (school_id)
  75.         ");
  76.     }
  77.     public function down(Schema $schema): void
  78.     {
  79.         // 必要に応じてロールバック処理を記述
  80.     }
  81. }