app/DoctrineMigrations/Version20251119163203.php line 1

Open in your IDE?
  1. <?php
    
    declare(strict_types=1);
    
    namespace DoctrineMigrations;
    
    use Doctrine\DBAL\Schema\Schema;
    use Doctrine\Migrations\AbstractMigration;
    
    /**
     * dtb_school_brother_displayテーブルのインデックスと外部キーを再作成
     */
    final class Version20251119163203 extends AbstractMigration
    {
        public function getDescription(): string
        {
            return 'dtb_school_brother_displayテーブルのインデックスと外部キー制約を正しい順序で再作成';
        }
    
        public function up(Schema $schema): void
        {
            // MySQLの場合のみ実行
            if ($this->connection->getDatabasePlatform()->getName() !== 'mysql') {
                return;
            }
    
            // 既存の外部キー制約を確認して削除
            $foreignKeys = $this->connection->fetchAllAssociative("
                SELECT CONSTRAINT_NAME 
                FROM information_schema.TABLE_CONSTRAINTS 
                WHERE TABLE_SCHEMA = DATABASE() 
                AND TABLE_NAME = 'dtb_school_brother_display' 
                AND CONSTRAINT_TYPE = 'FOREIGN KEY'
            ");
            
            foreach ($foreignKeys as $fk) {
                $this->addSql("ALTER TABLE dtb_school_brother_display DROP FOREIGN KEY " . $fk['CONSTRAINT_NAME']);
            }
            
            // 古いインデックスを削除
            $indexes = $this->connection->fetchAllAssociative("
                SELECT DISTINCT INDEX_NAME 
                FROM information_schema.STATISTICS 
                WHERE TABLE_SCHEMA = DATABASE() 
                AND TABLE_NAME = 'dtb_school_brother_display' 
                AND INDEX_NAME IN ('idx_school_brother_display_base_school', 'idx_school_brother_display_target_school')
            ");
            
            foreach ($indexes as $index) {
                $this->addSql("DROP INDEX " . $index['INDEX_NAME'] . " ON dtb_school_brother_display");
            }
            
            // 新しいインデックスが既に存在する場合は削除
            $existingIndexes = $this->connection->fetchAllAssociative("
                SELECT DISTINCT INDEX_NAME 
                FROM information_schema.STATISTICS 
                WHERE TABLE_SCHEMA = DATABASE() 
                AND TABLE_NAME = 'dtb_school_brother_display' 
                AND INDEX_NAME IN ('IDX_54988867006D663', 'IDX_5498886F79E35C2')
            ");
            
            foreach ($existingIndexes as $index) {
                $this->addSql("DROP INDEX " . $index['INDEX_NAME'] . " ON dtb_school_brother_display");
            }
            
            // 新しいインデックスを作成
            $this->addSql("CREATE INDEX IDX_54988867006D663 ON dtb_school_brother_display (base_school_id)");
            $this->addSql("CREATE INDEX IDX_5498886F79E35C2 ON dtb_school_brother_display (target_school_id)");
            
            // 外部キー制約を作成
            $this->addSql("
                ALTER TABLE dtb_school_brother_display 
                ADD CONSTRAINT FK_54988867006D663 
                FOREIGN KEY (base_school_id) REFERENCES dtb_school (school_id)
            ");
            
            $this->addSql("
                ALTER TABLE dtb_school_brother_display 
                ADD CONSTRAINT FK_5498886F79E35C2 
                FOREIGN KEY (target_school_id) REFERENCES dtb_school (school_id)
            ");
        }
    
        public function down(Schema $schema): void
        {
            // 必要に応じてロールバック処理を記述
        }
    }