<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* データベースバックアップ履歴テーブルの作成
*/
final class Version20251021110000 extends AbstractMigration
{
public function getDescription(): string
{
return 'データベースバックアップ履歴を管理するdtb_database_backupテーブルを作成';
}
public function up(Schema $schema): void
{
$schemaManager = $this->connection->createSchemaManager();
// テーブルが既に存在する場合はスキップ
if ($schemaManager->tablesExist(['dtb_database_backup'])) {
return;
}
// MySQLの場合
if ($this->connection->getDatabasePlatform()->getName() === 'mysql') {
$this->addSql('
CREATE TABLE dtb_database_backup (
id INT UNSIGNED AUTO_INCREMENT NOT NULL,
file_name VARCHAR(255) NOT NULL,
file_path VARCHAR(4000) DEFAULT NULL,
file_size BIGINT UNSIGNED DEFAULT NULL,
backup_type VARCHAR(50) NOT NULL,
note VARCHAR(4000) DEFAULT NULL,
create_date DATETIME NOT NULL COMMENT \'(DC2Type:datetimetz)\',
update_date DATETIME NOT NULL COMMENT \'(DC2Type:datetimetz)\',
creator_id INT UNSIGNED DEFAULT NULL,
discriminator_type VARCHAR(255) NOT NULL,
INDEX IDX_DB_BACKUP_CREATOR (creator_id),
INDEX IDX_DB_BACKUP_TYPE (backup_type),
INDEX IDX_DB_BACKUP_CREATE_DATE (create_date),
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin ENGINE = InnoDB
');
$this->addSql('
ALTER TABLE dtb_database_backup
ADD CONSTRAINT FK_577BF5EB61220EA6
FOREIGN KEY (creator_id) REFERENCES dtb_member (id)
');
}
// PostgreSQLの場合
elseif ($this->connection->getDatabasePlatform()->getName() === 'postgresql') {
$this->addSql('
CREATE TABLE dtb_database_backup (
id SERIAL NOT NULL,
file_name VARCHAR(255) NOT NULL,
file_path VARCHAR(4000) DEFAULT NULL,
file_size BIGINT DEFAULT NULL,
backup_type VARCHAR(50) NOT NULL,
note VARCHAR(4000) DEFAULT NULL,
create_date TIMESTAMP(0) WITH TIME ZONE NOT NULL,
update_date TIMESTAMP(0) WITH TIME ZONE NOT NULL,
creator_id INT DEFAULT NULL,
discriminator_type VARCHAR(255) NOT NULL,
PRIMARY KEY(id)
)
');
$this->addSql('CREATE INDEX IDX_DB_BACKUP_CREATOR ON dtb_database_backup (creator_id)');
$this->addSql('CREATE INDEX IDX_DB_BACKUP_TYPE ON dtb_database_backup (backup_type)');
$this->addSql('CREATE INDEX IDX_DB_BACKUP_CREATE_DATE ON dtb_database_backup (create_date)');
$this->addSql('
ALTER TABLE dtb_database_backup
ADD CONSTRAINT FK_577BF5EB61220EA6
FOREIGN KEY (creator_id) REFERENCES dtb_member (id) NOT DEFERRABLE INITIALLY IMMEDIATE
');
}
}
public function down(Schema $schema): void
{
$schemaManager = $this->connection->createSchemaManager();
// テーブルが存在しない場合はスキップ
if (!$schemaManager->tablesExist(['dtb_database_backup'])) {
return;
}
// MySQLの場合
if ($this->connection->getDatabasePlatform()->getName() === 'mysql') {
// 外部キー制約を削除
$this->addSql('ALTER TABLE dtb_database_backup DROP FOREIGN KEY FK_577BF5EB61220EA6');
// テーブルを削除(インデックスも自動的に削除される)
$this->addSql('DROP TABLE dtb_database_backup');
}
// PostgreSQLの場合
elseif ($this->connection->getDatabasePlatform()->getName() === 'postgresql') {
// 外部キー制約を削除
$this->addSql('ALTER TABLE dtb_database_backup DROP CONSTRAINT FK_577BF5EB61220EA6');
// インデックスを削除
$this->addSql('DROP INDEX IF EXISTS IDX_DB_BACKUP_CREATOR');
$this->addSql('DROP INDEX IF EXISTS IDX_DB_BACKUP_TYPE');
$this->addSql('DROP INDEX IF EXISTS IDX_DB_BACKUP_CREATE_DATE');
// テーブルを削除
$this->addSql('DROP TABLE dtb_database_backup');
}
}
}