<?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');
}
}
}