app/DoctrineMigrations/Version20261016000001.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_grade        : グレードマスタ
  10.  * - dtb_repair_menu_grade   : 修理メニューとグレードの対応(複数可)
  11.  * - dtb_product_repair_item.repair_menu_id : 修理依頼の明細が元にした修理メニュー(グレード表示用)
  12.  *
  13.  * 先に doctrine:schema:update --force でテーブルが作成されている環境でも実行できるよう、
  14.  * 既に存在するテーブル・カラムはスキップする.
  15.  */
  16. final class Version20261016000001 extends AbstractMigration
  17. {
  18.     private const TABLE_OPTIONS = 'DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_bin` ENGINE = InnoDB';
  19.     public function getDescription(): string
  20.     {
  21.         return 'Add repair grade master and grade assignments for repair menus';
  22.     }
  23.     public function up(Schema $schema): void
  24.     {
  25.         // グレードマスタ
  26.         if (!$schema->hasTable('dtb_repair_grade')) {
  27.             $this->addSql("CREATE TABLE dtb_repair_grade (id INT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT 'ID', name VARCHAR(255) NOT NULL, sort_no SMALLINT UNSIGNED NOT NULL, discriminator_type VARCHAR(255) NOT NULL, PRIMARY KEY(id)) " . self::TABLE_OPTIONS);
  28.         }
  29.         // 修理メニューとグレードの対応
  30.         if (!$schema->hasTable('dtb_repair_menu_grade')) {
  31.             $this->addSql("CREATE TABLE dtb_repair_menu_grade (repair_menu_id INT UNSIGNED NOT NULL COMMENT 'ID', repair_grade_id INT UNSIGNED NOT NULL COMMENT 'ID', INDEX IDX_A9A1B469526CBC81 (repair_menu_id), INDEX IDX_A9A1B4699781D803 (repair_grade_id), PRIMARY KEY(repair_menu_id, repair_grade_id)) " . self::TABLE_OPTIONS);
  32.             $this->addSql('ALTER TABLE dtb_repair_menu_grade ADD CONSTRAINT FK_A9A1B469526CBC81 FOREIGN KEY (repair_menu_id) REFERENCES dtb_repair_menu (id) ON DELETE CASCADE');
  33.             $this->addSql('ALTER TABLE dtb_repair_menu_grade ADD CONSTRAINT FK_A9A1B4699781D803 FOREIGN KEY (repair_grade_id) REFERENCES dtb_repair_grade (id) ON DELETE CASCADE');
  34.         }
  35.         // 修理依頼の明細が元にした修理メニュー
  36.         if (!$schema->getTable('dtb_product_repair_item')->hasColumn('repair_menu_id')) {
  37.             $this->addSql("ALTER TABLE dtb_product_repair_item ADD repair_menu_id INT UNSIGNED DEFAULT NULL COMMENT 'ID'");
  38.             $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');
  39.             $this->addSql('CREATE INDEX IDX_50024CF2526CBC81 ON dtb_product_repair_item (repair_menu_id)');
  40.         }
  41.         // 既存の修理依頼の明細を、区分と名称が一致する修理メニューに紐づける(同名のメニューが1件だけの場合)
  42.         $this->addSql('UPDATE dtb_product_repair_item i
  43.             INNER JOIN (
  44.                 SELECT type, name, MIN(id) AS id FROM dtb_repair_menu GROUP BY type, name HAVING COUNT(*) = 1
  45.             ) m ON m.type = i.type AND m.name = i.name
  46.             SET i.repair_menu_id = m.id
  47.             WHERE i.repair_menu_id IS NULL');
  48.     }
  49.     public function down(Schema $schema): void
  50.     {
  51.         if ($schema->getTable('dtb_product_repair_item')->hasColumn('repair_menu_id')) {
  52.             $this->addSql('ALTER TABLE dtb_product_repair_item DROP FOREIGN KEY FK_50024CF2526CBC81');
  53.             $this->addSql('DROP INDEX IDX_50024CF2526CBC81 ON dtb_product_repair_item');
  54.             $this->addSql('ALTER TABLE dtb_product_repair_item DROP COLUMN repair_menu_id');
  55.         }
  56.         if ($schema->hasTable('dtb_repair_menu_grade')) {
  57.             $this->addSql('DROP TABLE dtb_repair_menu_grade');
  58.         }
  59.         if ($schema->hasTable('dtb_repair_grade')) {
  60.             $this->addSql('DROP TABLE dtb_repair_grade');
  61.         }
  62.     }
  63. }