app/DoctrineMigrations/Version20250922000000.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.  * dtb_maintenance_settings - メンテナンス設定テーブル
  9.  * dtb_maintenance_school - メンテナンス対象学校テーブル
  10.  */
  11. final class Version20250922000000 extends AbstractMigration
  12. {
  13.     public function getDescription(): string
  14.     {
  15.         return 'メンテナンス管理機能のテーブル(dtb_maintenance_settings, dtb_maintenance_school)を作成';
  16.     }
  17.     public function up(Schema $schema): void
  18.     {
  19.         $schemaManager $this->connection->createSchemaManager();
  20.         
  21.         // dtb_maintenance_settingsテーブルの作成
  22.         if (!$schemaManager->tablesExist(['dtb_maintenance_settings'])) {
  23.             $this->addSql('
  24.                 CREATE TABLE dtb_maintenance_settings (
  25.                     id INT UNSIGNED AUTO_INCREMENT NOT NULL,
  26.                     status INT UNSIGNED DEFAULT 0 NOT NULL,
  27.                     target_type INT UNSIGNED DEFAULT 1 NOT NULL,
  28.                     title VARCHAR(255) DEFAULT NULL,
  29.                     content TEXT DEFAULT NULL,
  30.                     start_time DATETIME DEFAULT NULL,
  31.                     end_time DATETIME DEFAULT NULL,
  32.                     create_date DATETIME NOT NULL,
  33.                     update_date DATETIME NOT NULL,
  34.                     PRIMARY KEY(id)
  35.                 ) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE = InnoDB
  36.             ');
  37.         }
  38.         // dtb_maintenance_schoolテーブルの作成
  39.         if (!$schemaManager->tablesExist(['dtb_maintenance_school'])) {
  40.             $this->addSql('
  41.                 CREATE TABLE dtb_maintenance_school (
  42.                     id INT UNSIGNED AUTO_INCREMENT NOT NULL,
  43.                     maintenance_settings_id INT UNSIGNED DEFAULT NULL,
  44.                     school_id INT UNSIGNED DEFAULT NULL,
  45.                     title VARCHAR(255) DEFAULT NULL,
  46.                     content TEXT DEFAULT NULL,
  47.                     start_time DATETIME DEFAULT NULL,
  48.                     end_time DATETIME DEFAULT NULL,
  49.                     create_date DATETIME NOT NULL,
  50.                     update_date DATETIME NOT NULL,
  51.                     INDEX IDX_maintenance_settings (maintenance_settings_id),
  52.                     INDEX IDX_school (school_id),
  53.                     PRIMARY KEY(id)
  54.                 ) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE = InnoDB
  55.             ');
  56.         }
  57.         // 外部キー制約の追加
  58.         if ($schemaManager->tablesExist(['dtb_maintenance_settings''dtb_maintenance_school'])) {
  59.             $foreignKeys $schemaManager->listTableForeignKeys('dtb_maintenance_school');
  60.             $foreignKeyNames array_map(function($fk) {
  61.                 return strtolower($fk->getName());
  62.             }, $foreignKeys);
  63.             
  64.             // maintenance_settings_idの外部キー制約
  65.             if (!in_array('fk_maintenance_settings_id'$foreignKeyNames)) {
  66.                 // 整合性のないデータをクリーンアップ
  67.                 $this->addSql('
  68.                     DELETE FROM dtb_maintenance_school 
  69.                     WHERE maintenance_settings_id IS NOT NULL 
  70.                     AND maintenance_settings_id NOT IN (SELECT id FROM dtb_maintenance_settings)
  71.                 ');
  72.                 
  73.                 $this->addSql('
  74.                     ALTER TABLE dtb_maintenance_school 
  75.                     ADD CONSTRAINT FK_maintenance_settings_id 
  76.                     FOREIGN KEY (maintenance_settings_id) 
  77.                     REFERENCES dtb_maintenance_settings (id) 
  78.                     ON DELETE CASCADE
  79.                 ');
  80.             }
  81.             // school_idの外部キー制約 - dtb_schoolテーブルが存在する場合のみ
  82.             if ($schemaManager->tablesExist(['dtb_school']) && !in_array('fk_maintenance_school_id'$foreignKeyNames)) {
  83.                 // dtb_schoolのidカラムの型を確認
  84.                 $schoolColumns $schemaManager->listTableColumns('dtb_school');
  85.                 if (isset($schoolColumns['id'])) {
  86.                     // 整合性のないデータをクリーンアップ
  87.                     $this->addSql('
  88.                         DELETE FROM dtb_maintenance_school 
  89.                         WHERE school_id IS NOT NULL 
  90.                         AND school_id NOT IN (SELECT id FROM dtb_school)
  91.                     ');
  92.                     
  93.                     $this->addSql('
  94.                         ALTER TABLE dtb_maintenance_school 
  95.                         ADD CONSTRAINT FK_maintenance_school_id 
  96.                         FOREIGN KEY (school_id) 
  97.                         REFERENCES dtb_school (id) 
  98.                         ON DELETE CASCADE
  99.                     ');
  100.                 }
  101.             }
  102.         }
  103.     }
  104.     public function down(Schema $schema): void
  105.     {
  106.         $schemaManager $this->connection->createSchemaManager();
  107.         
  108.         // 外部キー制約の削除
  109.         if ($schemaManager->tablesExist(['dtb_maintenance_school'])) {
  110.             $foreignKeys $schemaManager->listTableForeignKeys('dtb_maintenance_school');
  111.             $foreignKeyNames array_map(function($fk) {
  112.                 return strtolower($fk->getName());
  113.             }, $foreignKeys);
  114.             
  115.             if (in_array('fk_maintenance_settings_id'$foreignKeyNames)) {
  116.                 $this->addSql('ALTER TABLE dtb_maintenance_school DROP FOREIGN KEY FK_maintenance_settings_id');
  117.             }
  118.             
  119.             if (in_array('fk_maintenance_school_id'$foreignKeyNames)) {
  120.                 $this->addSql('ALTER TABLE dtb_maintenance_school DROP FOREIGN KEY FK_maintenance_school_id');
  121.             }
  122.         }
  123.         
  124.         // テーブルの削除
  125.         if ($schemaManager->tablesExist(['dtb_maintenance_school'])) {
  126.             $this->addSql('DROP TABLE dtb_maintenance_school');
  127.         }
  128.         
  129.         if ($schemaManager->tablesExist(['dtb_maintenance_settings'])) {
  130.             $this->addSql('DROP TABLE dtb_maintenance_settings');
  131.         }
  132.     }
  133. }