app/DoctrineMigrations/Version20251119163454.php line 1

Open in your IDE?
  1. <?php
    
    declare(strict_types=1);
    
    namespace DoctrineMigrations;
    
    use Doctrine\DBAL\Schema\Schema;
    use Doctrine\Migrations\AbstractMigration;
    
    /**
     * plg_claim_pdfテーブルのインデックスと外部キーを再作成
     */
    final class Version20251119163454 extends AbstractMigration
    {
        public function getDescription(): string
        {
            return 'plg_claim_pdfテーブルのインデックスと外部キー制約を正しい順序で再作成';
        }
    
        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 = 'plg_claim_pdf' 
                AND CONSTRAINT_TYPE = 'FOREIGN KEY'
            ");
            
            foreach ($foreignKeys as $fk) {
                $this->addSql("ALTER TABLE plg_claim_pdf 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 = 'plg_claim_pdf' 
                AND INDEX_NAME = 'idx_seller_output_name'
            ");
            
            foreach ($indexes as $index) {
                $this->addSql("DROP INDEX " . $index['INDEX_NAME'] . " ON plg_claim_pdf");
            }
            
            // 新しいインデックスを作成(既に存在する場合はスキップ)
            $newIndexes = $this->connection->fetchAllAssociative("
                SELECT DISTINCT INDEX_NAME 
                FROM information_schema.STATISTICS 
                WHERE TABLE_SCHEMA = DATABASE() 
                AND TABLE_NAME = 'plg_claim_pdf' 
                AND INDEX_NAME = 'IDX_4AC5FA311A1C4E0E'
            ");
            
            if (empty($newIndexes)) {
                $this->addSql("CREATE INDEX IDX_4AC5FA311A1C4E0E ON plg_claim_pdf (seller_output_name_id)");
            }
            
            // 外部キー制約を作成(既に存在する場合はスキップ)
            $newForeignKeys = $this->connection->fetchAllAssociative("
                SELECT CONSTRAINT_NAME 
                FROM information_schema.TABLE_CONSTRAINTS 
                WHERE TABLE_SCHEMA = DATABASE() 
                AND TABLE_NAME = 'plg_claim_pdf' 
                AND CONSTRAINT_TYPE = 'FOREIGN KEY'
                AND CONSTRAINT_NAME = 'FK_4AC5FA311A1C4E0E'
            ");
            
            if (empty($newForeignKeys)) {
                $this->addSql("
                    ALTER TABLE plg_claim_pdf 
                    ADD CONSTRAINT FK_4AC5FA311A1C4E0E 
                    FOREIGN KEY (seller_output_name_id) REFERENCES dtb_seller_output_name (id)
                ");
            }
        }
    
        public function down(Schema $schema): void
        {
            // 必要に応じてロールバック処理を記述
        }
    }