<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* 修理メニュー(詳細項目)のグレード機能.
*
* - dtb_repair_menu_grade_option : 修理メニューのグレード(名称・金額・説明・表示順)
* - dtb_product_repair_item : 元にした修理メニュー・選んだグレード・依頼時点のグレード名/説明
*
* ※ 以前のグレード実装(Version20261016000001、取り消し済み)で作られた dtb_repair_grade /
* dtb_repair_menu_grade が残っている環境があるため、それらとは別のテーブル名を使い、触らない.
* ※ dtb_product_repair_item.repair_menu_id は上記の実装で追加済みの環境があるため、無い場合のみ追加する.
* 既に存在するテーブル・カラムはスキップする(何度実行しても同じ結果になる).
*/
final class Version20261113000001 extends AbstractMigration
{
private const TABLE_OPTIONS = 'DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_bin` ENGINE = InnoDB';
public function getDescription(): string
{
return 'Add repair menu grades (dtb_repair_menu_grade_option) and grade columns on dtb_product_repair_item';
}
public function up(Schema $schema): void
{
if (!$schema->hasTable('dtb_repair_menu_grade_option')) {
$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);
$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');
}
$item = $schema->getTable('dtb_product_repair_item');
if (!$item->hasColumn('repair_menu_id')) {
$this->addSql("ALTER TABLE dtb_product_repair_item ADD repair_menu_id INT UNSIGNED DEFAULT NULL COMMENT 'ID'");
$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');
$this->addSql('CREATE INDEX IDX_50024CF2526CBC81 ON dtb_product_repair_item (repair_menu_id)');
// 既存の明細を、区分と名称が一致する修理メニューに紐づける(同じ区分・名称のメニューが1件だけの場合)
$this->addSql('UPDATE dtb_product_repair_item i
INNER JOIN (
SELECT type, name, MIN(id) AS id FROM dtb_repair_menu GROUP BY type, name HAVING COUNT(*) = 1
) m ON m.type = i.type AND m.name = i.name
SET i.repair_menu_id = m.id
WHERE i.repair_menu_id IS NULL');
}
if (!$item->hasColumn('repair_menu_grade_id')) {
$this->addSql("ALTER TABLE dtb_product_repair_item ADD repair_menu_grade_id INT UNSIGNED DEFAULT NULL COMMENT 'ID'");
$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');
$this->addSql('CREATE INDEX IDX_50024CF284B79C09 ON dtb_product_repair_item (repair_menu_grade_id)');
}
if (!$item->hasColumn('grade_name')) {
$this->addSql('ALTER TABLE dtb_product_repair_item ADD grade_name VARCHAR(255) DEFAULT NULL');
}
if (!$item->hasColumn('grade_description')) {
$this->addSql('ALTER TABLE dtb_product_repair_item ADD grade_description LONGTEXT DEFAULT NULL');
}
}
public function down(Schema $schema): void
{
$item = $schema->getTable('dtb_product_repair_item');
if ($item->hasColumn('repair_menu_grade_id')) {
$this->addSql('ALTER TABLE dtb_product_repair_item DROP FOREIGN KEY FK_50024CF284B79C09');
$this->addSql('DROP INDEX IDX_50024CF284B79C09 ON dtb_product_repair_item');
$this->addSql('ALTER TABLE dtb_product_repair_item DROP repair_menu_grade_id');
}
if ($item->hasColumn('grade_name')) {
$this->addSql('ALTER TABLE dtb_product_repair_item DROP grade_name');
}
if ($item->hasColumn('grade_description')) {
$this->addSql('ALTER TABLE dtb_product_repair_item DROP grade_description');
}
// repair_menu_id は以前の実装で追加された環境もあるため残す
if ($schema->hasTable('dtb_repair_menu_grade_option')) {
$this->addSql('DROP TABLE dtb_repair_menu_grade_option');
}
}
}