<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* 修理グレード(修理メニューに設定する表示用のグレード)のテーブル追加.
*
* - dtb_repair_grade : グレードマスタ
* - dtb_repair_menu_grade : 修理メニューとグレードの対応(複数可)
* - dtb_product_repair_item.repair_menu_id : 修理依頼の明細が元にした修理メニュー(グレード表示用)
*
* 先に doctrine:schema:update --force でテーブルが作成されている環境でも実行できるよう、
* 既に存在するテーブル・カラムはスキップする.
*/
final class Version20261016000001 extends AbstractMigration
{
private const TABLE_OPTIONS = 'DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_bin` ENGINE = InnoDB';
public function getDescription(): string
{
return 'Add repair grade master and grade assignments for repair menus';
}
public function up(Schema $schema): void
{
// グレードマスタ
if (!$schema->hasTable('dtb_repair_grade')) {
$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);
}
// 修理メニューとグレードの対応
if (!$schema->hasTable('dtb_repair_menu_grade')) {
$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);
$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');
$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');
}
// 修理依頼の明細が元にした修理メニュー
if (!$schema->getTable('dtb_product_repair_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');
}
public function down(Schema $schema): void
{
if ($schema->getTable('dtb_product_repair_item')->hasColumn('repair_menu_id')) {
$this->addSql('ALTER TABLE dtb_product_repair_item DROP FOREIGN KEY FK_50024CF2526CBC81');
$this->addSql('DROP INDEX IDX_50024CF2526CBC81 ON dtb_product_repair_item');
$this->addSql('ALTER TABLE dtb_product_repair_item DROP COLUMN repair_menu_id');
}
if ($schema->hasTable('dtb_repair_menu_grade')) {
$this->addSql('DROP TABLE dtb_repair_menu_grade');
}
if ($schema->hasTable('dtb_repair_grade')) {
$this->addSql('DROP TABLE dtb_repair_grade');
}
}
}