app/DoctrineMigrations/Version20251029000000.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.  * オーダーメール設定フラグの値を変更
  8.  * 1:表示しない, 2:表示する → 0:表示しない, 1:表示する
  9.  */
  10. final class Version20251029000000 extends AbstractMigration
  11. {
  12.     public function getDescription(): string
  13.     {
  14.         return 'オーダーメール設定フラグの値を変更 (1,2 → 0,1)';
  15.     }
  16.     public function up(Schema $schema): void
  17.     {
  18.         // 既存データの値を変換
  19.         // 旧形式から新形式への変換:
  20.         // 2 → 1 (表示する)
  21.         // 1 → 0 (表示しない)
  22.         // NULL → 1 (表示する - デフォルト)
  23.         // 
  24.         // 実行条件: テーブルに値「2」が存在し、かつ値「0」が存在しない場合のみ実行(旧形式が残っている場合)
  25.         // 既に新形式(0,1のみ)に変換済みの場合は何もしない
  26.         
  27.         // まず、旧形式か新形式かをチェック
  28.         $connection $this->connection;
  29.         $hasOldFormat false;
  30.         $hasNewFormat false;
  31.         
  32.         $columns = [
  33.             'order_email_product_details_flag',
  34.             'order_email_customer_info_flag',
  35.             'order_email_school_name_flag',
  36.             'order_email_admission_year_flag',
  37.             'order_email_shipping_info_flag'
  38.         ];
  39.         
  40.         // 値「2」が存在するかチェック(旧形式の証拠)
  41.         foreach ($columns as $column) {
  42.             $result $connection->fetchOne("SELECT COUNT(*) FROM dtb_school WHERE {$column} = 2");
  43.             if ($result 0) {
  44.                 $hasOldFormat true;
  45.                 break;
  46.             }
  47.         }
  48.         
  49.         // 値「0」が存在するかチェック(新形式の証拠)
  50.         foreach ($columns as $column) {
  51.             $result $connection->fetchOne("SELECT COUNT(*) FROM dtb_school WHERE {$column} = 0");
  52.             if ($result 0) {
  53.                 $hasNewFormat true;
  54.                 break;
  55.             }
  56.         }
  57.         
  58.         // 旧形式が存在し、かつ新形式が存在しない場合のみ変換を実行
  59.         if ($hasOldFormat && !$hasNewFormat) {
  60.             $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');
  61.             $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');
  62.             $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');
  63.             $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');
  64.             $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');
  65.         }
  66.     }
  67.     public function down(Schema $schema): void
  68.     {
  69.         // ロールバック時は逆の変換を行う
  70.         // 新形式から旧形式への変換:
  71.         // 1 → 2 (表示する)
  72.         // 0 → 1 (表示しない)
  73.         // 
  74.         // 実行条件: テーブルに値「0」が存在し、かつ値「2」が存在しない場合のみ実行(新形式が存在する場合)
  75.         // 既に旧形式(1,2)に戻っている場合は何もしない
  76.         
  77.         // まず、新形式か旧形式かをチェック
  78.         $connection $this->connection;
  79.         $hasNewFormat false;
  80.         $hasOldFormat false;
  81.         
  82.         $columns = [
  83.             'order_email_product_details_flag',
  84.             'order_email_customer_info_flag',
  85.             'order_email_school_name_flag',
  86.             'order_email_admission_year_flag',
  87.             'order_email_shipping_info_flag'
  88.         ];
  89.         
  90.         // 値「0」が存在するかチェック(新形式の証拠)
  91.         foreach ($columns as $column) {
  92.             $result $connection->fetchOne("SELECT COUNT(*) FROM dtb_school WHERE {$column} = 0");
  93.             if ($result 0) {
  94.                 $hasNewFormat true;
  95.                 break;
  96.             }
  97.         }
  98.         
  99.         // 値「2」が存在するかチェック(旧形式の証拠)
  100.         foreach ($columns as $column) {
  101.             $result $connection->fetchOne("SELECT COUNT(*) FROM dtb_school WHERE {$column} = 2");
  102.             if ($result 0) {
  103.                 $hasOldFormat true;
  104.                 break;
  105.             }
  106.         }
  107.         
  108.         // 新形式が存在し、かつ旧形式が存在しない場合のみロールバックを実行
  109.         if ($hasNewFormat && !$hasOldFormat) {
  110.             $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');
  111.             $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');
  112.             $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');
  113.             $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');
  114.             $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');
  115.         }
  116.     }
  117. }