app/DoctrineMigrations/Version20261113000001.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.  *
  9.  * - dtb_repair_menu_grade_option : 修理メニューのグレード(名称・金額・説明・表示順)
  10.  * - dtb_product_repair_item      : 元にした修理メニュー・選んだグレード・依頼時点のグレード名/説明
  11.  *
  12.  * ※ 以前のグレード実装(Version20261016000001、取り消し済み)で作られた dtb_repair_grade /
  13.  *   dtb_repair_menu_grade が残っている環境があるため、それらとは別のテーブル名を使い、触らない.
  14.  * ※ dtb_product_repair_item.repair_menu_id は上記の実装で追加済みの環境があるため、無い場合のみ追加する.
  15.  * 既に存在するテーブル・カラムはスキップする(何度実行しても同じ結果になる).
  16.  */
  17. final class Version20261113000001 extends AbstractMigration
  18. {
  19.     private const TABLE_OPTIONS = 'DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_bin` ENGINE = InnoDB';
  20.     public function getDescription(): string
  21.     {
  22.         return 'Add repair menu grades (dtb_repair_menu_grade_option) and grade columns on dtb_product_repair_item';
  23.     }
  24.     public function up(Schema $schema): void
  25.     {
  26.         if (!$schema->hasTable('dtb_repair_menu_grade_option')) {
  27.             $this->addSql("CREATE TABLE dtb_repair_menu_grade_option (id INT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT 'ID', repair_menu_id INT UNSIGNED NOT NULL COMMENT 'ID', name VARCHAR(255) NOT NULL, price INT UNSIGNED DEFAULT 0 NOT NULL, description LONGTEXT DEFAULT NULL, sort_no SMALLINT UNSIGNED DEFAULT 0 NOT NULL, discriminator_type VARCHAR(255) NOT NULL, INDEX IDX_41E45FCF526CBC81 (repair_menu_id), PRIMARY KEY(id)) ".self::TABLE_OPTIONS);
  28.             $this->addSql('ALTER TABLE dtb_repair_menu_grade_option ADD CONSTRAINT FK_41E45FCF526CBC81 FOREIGN KEY (repair_menu_id) REFERENCES dtb_repair_menu (id) ON DELETE CASCADE');
  29.         }
  30.         $item = $schema->getTable('dtb_product_repair_item');
  31.         if (!$item->hasColumn('repair_menu_id')) {
  32.             $this->addSql("ALTER TABLE dtb_product_repair_item ADD repair_menu_id INT UNSIGNED DEFAULT NULL COMMENT 'ID'");
  33.             $this->addSql('ALTER TABLE dtb_product_repair_item ADD CONSTRAINT FK_50024CF2526CBC81 FOREIGN KEY (repair_menu_id) REFERENCES dtb_repair_menu (id) ON DELETE SET NULL');
  34.             $this->addSql('CREATE INDEX IDX_50024CF2526CBC81 ON dtb_product_repair_item (repair_menu_id)');
  35.             // 既存の明細を、区分と名称が一致する修理メニューに紐づける(同じ区分・名称のメニューが1件だけの場合)
  36.             $this->addSql('UPDATE dtb_product_repair_item i
  37.                 INNER JOIN (
  38.                     SELECT type, name, MIN(id) AS id FROM dtb_repair_menu GROUP BY type, name HAVING COUNT(*) = 1
  39.                 ) m ON m.type = i.type AND m.name = i.name
  40.                 SET i.repair_menu_id = m.id
  41.                 WHERE i.repair_menu_id IS NULL');
  42.         }
  43.         if (!$item->hasColumn('repair_menu_grade_id')) {
  44.             $this->addSql("ALTER TABLE dtb_product_repair_item ADD repair_menu_grade_id INT UNSIGNED DEFAULT NULL COMMENT 'ID'");
  45.             $this->addSql('ALTER TABLE dtb_product_repair_item ADD CONSTRAINT FK_50024CF284B79C09 FOREIGN KEY (repair_menu_grade_id) REFERENCES dtb_repair_menu_grade_option (id) ON DELETE SET NULL');
  46.             $this->addSql('CREATE INDEX IDX_50024CF284B79C09 ON dtb_product_repair_item (repair_menu_grade_id)');
  47.         }
  48.         if (!$item->hasColumn('grade_name')) {
  49.             $this->addSql('ALTER TABLE dtb_product_repair_item ADD grade_name VARCHAR(255) DEFAULT NULL');
  50.         }
  51.         if (!$item->hasColumn('grade_description')) {
  52.             $this->addSql('ALTER TABLE dtb_product_repair_item ADD grade_description LONGTEXT DEFAULT NULL');
  53.         }
  54.     }
  55.     public function down(Schema $schema): void
  56.     {
  57.         $item = $schema->getTable('dtb_product_repair_item');
  58.         if ($item->hasColumn('repair_menu_grade_id')) {
  59.             $this->addSql('ALTER TABLE dtb_product_repair_item DROP FOREIGN KEY FK_50024CF284B79C09');
  60.             $this->addSql('DROP INDEX IDX_50024CF284B79C09 ON dtb_product_repair_item');
  61.             $this->addSql('ALTER TABLE dtb_product_repair_item DROP repair_menu_grade_id');
  62.         }
  63.         if ($item->hasColumn('grade_name')) {
  64.             $this->addSql('ALTER TABLE dtb_product_repair_item DROP grade_name');
  65.         }
  66.         if ($item->hasColumn('grade_description')) {
  67.             $this->addSql('ALTER TABLE dtb_product_repair_item DROP grade_description');
  68.         }
  69.         // repair_menu_id は以前の実装で追加された環境もあるため残す
  70.         if ($schema->hasTable('dtb_repair_menu_grade_option')) {
  71.             $this->addSql('DROP TABLE dtb_repair_menu_grade_option');
  72.         }
  73.     }
  74. }