app/DoctrineMigrations/Version20251029000000.php line 1

Open in your IDE?
  1. <?php
    
    declare(strict_types=1);
    
    namespace DoctrineMigrations;
    
    use Doctrine\DBAL\Schema\Schema;
    use Doctrine\Migrations\AbstractMigration;
    
    /**
     * オーダーメール設定フラグの値を変更
     * 1:表示しない, 2:表示する → 0:表示しない, 1:表示する
     */
    final class Version20251029000000 extends AbstractMigration
    {
        public function getDescription(): string
        {
            return 'オーダーメール設定フラグの値を変更 (1,2 → 0,1)';
        }
    
        public function up(Schema $schema): void
        {
            // 既存データの値を変換
            // 旧形式から新形式への変換:
            // 2 → 1 (表示する)
            // 1 → 0 (表示しない)
            // NULL → 1 (表示する - デフォルト)
            // 
            // 実行条件: テーブルに値「2」が存在し、かつ値「0」が存在しない場合のみ実行(旧形式が残っている場合)
            // 既に新形式(0,1のみ)に変換済みの場合は何もしない
            
            // まず、旧形式か新形式かをチェック
            $connection = $this->connection;
            $hasOldFormat = false;
            $hasNewFormat = false;
            
            $columns = [
                'order_email_product_details_flag',
                'order_email_customer_info_flag',
                'order_email_school_name_flag',
                'order_email_admission_year_flag',
                'order_email_shipping_info_flag'
            ];
            
            // 値「2」が存在するかチェック(旧形式の証拠)
            foreach ($columns as $column) {
                $result = $connection->fetchOne("SELECT COUNT(*) FROM dtb_school WHERE {$column} = 2");
                if ($result > 0) {
                    $hasOldFormat = true;
                    break;
                }
            }
            
            // 値「0」が存在するかチェック(新形式の証拠)
            foreach ($columns as $column) {
                $result = $connection->fetchOne("SELECT COUNT(*) FROM dtb_school WHERE {$column} = 0");
                if ($result > 0) {
                    $hasNewFormat = true;
                    break;
                }
            }
            
            // 旧形式が存在し、かつ新形式が存在しない場合のみ変換を実行
            if ($hasOldFormat && !$hasNewFormat) {
                $this->addSql('UPDATE dtb_school SET order_email_product_details_flag = CASE WHEN order_email_product_details_flag = 2 THEN 1 WHEN order_email_product_details_flag = 1 THEN 0 WHEN order_email_product_details_flag IS NULL THEN 1 ELSE order_email_product_details_flag END');
                $this->addSql('UPDATE dtb_school SET order_email_customer_info_flag = CASE WHEN order_email_customer_info_flag = 2 THEN 1 WHEN order_email_customer_info_flag = 1 THEN 0 WHEN order_email_customer_info_flag IS NULL THEN 1 ELSE order_email_customer_info_flag END');
                $this->addSql('UPDATE dtb_school SET order_email_school_name_flag = CASE WHEN order_email_school_name_flag = 2 THEN 1 WHEN order_email_school_name_flag = 1 THEN 0 WHEN order_email_school_name_flag IS NULL THEN 1 ELSE order_email_school_name_flag END');
                $this->addSql('UPDATE dtb_school SET order_email_admission_year_flag = CASE WHEN order_email_admission_year_flag = 2 THEN 1 WHEN order_email_admission_year_flag = 1 THEN 0 WHEN order_email_admission_year_flag IS NULL THEN 1 ELSE order_email_admission_year_flag END');
                $this->addSql('UPDATE dtb_school SET order_email_shipping_info_flag = CASE WHEN order_email_shipping_info_flag = 2 THEN 1 WHEN order_email_shipping_info_flag = 1 THEN 0 WHEN order_email_shipping_info_flag IS NULL THEN 1 ELSE order_email_shipping_info_flag END');
            }
        }
    
        public function down(Schema $schema): void
        {
            // ロールバック時は逆の変換を行う
            // 新形式から旧形式への変換:
            // 1 → 2 (表示する)
            // 0 → 1 (表示しない)
            // 
            // 実行条件: テーブルに値「0」が存在し、かつ値「2」が存在しない場合のみ実行(新形式が存在する場合)
            // 既に旧形式(1,2)に戻っている場合は何もしない
            
            // まず、新形式か旧形式かをチェック
            $connection = $this->connection;
            $hasNewFormat = false;
            $hasOldFormat = false;
            
            $columns = [
                'order_email_product_details_flag',
                'order_email_customer_info_flag',
                'order_email_school_name_flag',
                'order_email_admission_year_flag',
                'order_email_shipping_info_flag'
            ];
            
            // 値「0」が存在するかチェック(新形式の証拠)
            foreach ($columns as $column) {
                $result = $connection->fetchOne("SELECT COUNT(*) FROM dtb_school WHERE {$column} = 0");
                if ($result > 0) {
                    $hasNewFormat = true;
                    break;
                }
            }
            
            // 値「2」が存在するかチェック(旧形式の証拠)
            foreach ($columns as $column) {
                $result = $connection->fetchOne("SELECT COUNT(*) FROM dtb_school WHERE {$column} = 2");
                if ($result > 0) {
                    $hasOldFormat = true;
                    break;
                }
            }
            
            // 新形式が存在し、かつ旧形式が存在しない場合のみロールバックを実行
            if ($hasNewFormat && !$hasOldFormat) {
                $this->addSql('UPDATE dtb_school SET order_email_product_details_flag = CASE WHEN order_email_product_details_flag = 1 THEN 2 WHEN order_email_product_details_flag = 0 THEN 1 ELSE order_email_product_details_flag END');
                $this->addSql('UPDATE dtb_school SET order_email_customer_info_flag = CASE WHEN order_email_customer_info_flag = 1 THEN 2 WHEN order_email_customer_info_flag = 0 THEN 1 ELSE order_email_customer_info_flag END');
                $this->addSql('UPDATE dtb_school SET order_email_school_name_flag = CASE WHEN order_email_school_name_flag = 1 THEN 2 WHEN order_email_school_name_flag = 0 THEN 1 ELSE order_email_school_name_flag END');
                $this->addSql('UPDATE dtb_school SET order_email_admission_year_flag = CASE WHEN order_email_admission_year_flag = 1 THEN 2 WHEN order_email_admission_year_flag = 0 THEN 1 ELSE order_email_admission_year_flag END');
                $this->addSql('UPDATE dtb_school SET order_email_shipping_info_flag = CASE WHEN order_email_shipping_info_flag = 1 THEN 2 WHEN order_email_shipping_info_flag = 0 THEN 1 ELSE order_email_shipping_info_flag END');
            }
        }
    }