<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* dtb_maintenance_schoolテーブルのインデックスと外部キーを再作成
*/
final class Version20251119162204 extends AbstractMigration
{
public function getDescription(): string
{
return 'dtb_maintenance_schoolテーブルのインデックスと外部キー制約を正しい順序で再作成';
}
public function up(Schema $schema): void
{
// MySQLの場合のみ実行
if ($this->connection->getDatabasePlatform()->getName() !== 'mysql') {
return;
}
// 既存の外部キー制約を確認して削除
$foreignKeys = $this->connection->fetchAllAssociative("
SELECT CONSTRAINT_NAME
FROM information_schema.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'dtb_maintenance_school'
AND CONSTRAINT_TYPE = 'FOREIGN KEY'
");
foreach ($foreignKeys as $fk) {
$this->addSql("ALTER TABLE dtb_maintenance_school DROP FOREIGN KEY " . $fk['CONSTRAINT_NAME']);
}
// 古いインデックスを削除
$indexes = $this->connection->fetchAllAssociative("
SELECT DISTINCT INDEX_NAME
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'dtb_maintenance_school'
AND INDEX_NAME IN ('idx_maintenance_settings', 'idx_school', 'IDX_C00A091853B3712F', 'IDX_C00A0918C32A47EE')
");
foreach ($indexes as $index) {
$this->addSql("DROP INDEX " . $index['INDEX_NAME'] . " ON dtb_maintenance_school");
}
// 無効な参照データをクリーンアップ(maintenance_settings_idが存在しないレコードを削除)
$this->addSql("
DELETE FROM dtb_maintenance_school
WHERE maintenance_settings_id IS NOT NULL
AND maintenance_settings_id NOT IN (SELECT id FROM dtb_maintenance_settings)
");
// 無効な参照データをクリーンアップ(school_idが存在しないレコードを削除)
$this->addSql("
DELETE FROM dtb_maintenance_school
WHERE school_id IS NOT NULL
AND school_id NOT IN (SELECT school_id FROM dtb_school)
");
// 新しいインデックスを作成(存在しない場合のみ)
$existingIndexes = $this->connection->fetchAllAssociative("
SELECT DISTINCT INDEX_NAME
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'dtb_maintenance_school'
AND INDEX_NAME = 'IDX_C00A091853B3712F'
");
if (empty($existingIndexes)) {
$this->addSql("CREATE INDEX IDX_C00A091853B3712F ON dtb_maintenance_school (maintenance_settings_id)");
}
$existingIndexes2 = $this->connection->fetchAllAssociative("
SELECT DISTINCT INDEX_NAME
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'dtb_maintenance_school'
AND INDEX_NAME = 'IDX_C00A0918C32A47EE'
");
if (empty($existingIndexes2)) {
$this->addSql("CREATE INDEX IDX_C00A0918C32A47EE ON dtb_maintenance_school (school_id)");
}
// 外部キー制約を再作成
$this->addSql("
ALTER TABLE dtb_maintenance_school
ADD CONSTRAINT FK_C00A091853B3712F
FOREIGN KEY (maintenance_settings_id) REFERENCES dtb_maintenance_settings (id)
");
$this->addSql("
ALTER TABLE dtb_maintenance_school
ADD CONSTRAINT FK_C00A0918C32A47EE
FOREIGN KEY (school_id) REFERENCES dtb_school (school_id)
");
}
public function down(Schema $schema): void
{
// 必要に応じてロールバック処理を記述
}
}